标题:求: VB.NET 的 DataGridView 控件中如何灵活使用 DataGridViewComboBoxCell
只看楼主
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
 问题点数:0 回复次数:14 
求: VB.NET 的 DataGridView 控件中如何灵活使用 DataGridViewComboBoxCell
我习惯于在窗体上加入DataGridView1控件,直接获取数据库表的数据,点击编辑按钮进入DataGridView1控件的增、删、改,然后保存。
数据库里面有2个表:
仓单表(进出货日期、订单编码,客户,物品名称,规格,重量,单价,客户单号)
客户表(客户简称,联络人,联系方式,地址)
在DataGridView1中显示仓单表进出货记录,其中客户列在编辑状态下希望做成为下拉组合框方式选择客户表的客户简称字段内容,避免DataGridView1编辑仓单记录时造成客户名称输入有误。
请问各位高手是如何灵活控制DataGridView单元格DataGridViewComboBoxCell从数据库表中获取备选项的呢?
现在我的做法是:
DataGridView1_CellBeginEdit事件中构造DataGridViewComboBoxCell组合框显示状态
    Dim a As Integer = DataGridView1.CurrentCell.RowIndex, b As Integer = DataGridView1.CurrentCell.ColumnIndex
    Dim Cell As New DataGridViewComboBoxCell
    If DataGridView1.Columns(e.ColumnIndex).HeaderText="客户" Then
       For Each Row0 As DataRow In DataTable4.Rows
                If Not (Cell.Items.Contains(Row0(0))) Then Cell.Items.Add(Row0(0)) '防止重复写入items,只要当前项不在items之中则Add
           Next Row0
       Cell.MaxDropDownItems = 50
       Cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing  '加入此设置就不用DataGridView1_CellEndEdit事件恢复单元格的文本框显示方式了 2014-12-16优化
       DataGridView1.Rows(a).Cells(b) = Cell
    End If

可以正常运行,符合预期,但是在运行过程中,偶尔会报错:
未处理 InvalidOperationException
操作无效,原因是它导致对 SetCurrentCellAddressCore 函数的可重入调用。

请各位高手给些建议,并提供些此类问题可靠的处理方式,不胜感激!

2014-12-16发现此错误是在 a=b 的情况下发生的,求各位高手帮忙分析一下吧

[ 本帖最后由 XIHONGSHI 于 2014-12-16 13:01 编辑 ]
搜索更多相关主题的帖子: 联系方式 数据库表 规格 如何 记录 
2014-12-02 15:57
jianjunfeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:42
专家分:166
注 册:2009-3-13
得分:0 

是这样的效果?
2014-12-03 13:40
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
是的,要的正是生产计划表中下部表格中部门这种单元格内下拉组合框框的效果。你是通过何种方式实现的呢?

2014-12-06 22:04
kjf9421
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-12-7
得分:0 
同求
2014-12-07 22:49
jianjunfeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:42
专家分:166
注 册:2009-3-13
得分:0 
回复 3 楼 XIHONGSHI
Private Sub Frm_prdt_tps_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sqstr As String = "select * from dept"
        obj.查询(Me.DataGridView5, sqstr, Fstr)‘自己做的DLL
        With Me.DataGridView5
            If .Rows.Count > 0 Then
                ()
                ("")
                For i As Integer = 0 To .Rows.Count - 1
                    (.Item(0, i).Value.ToString.Trim)
                Next
            End If
        End With
    End Sub
    Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
        With Me.DataGridView1
            .Controls.Clear()
            If .CurrentCell.ColumnIndex = 23 Then
                .Controls.Add() ';//dataGr
                = .Item(23, .CurrentCell.RowIndex).Value.ToString.Trim
                = .GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True).Width  ';//获取单元格高并设置为btn的宽
                = New System.Drawing.Point(((.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True).Right) - ()), .GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True).Y) ';//设置btn显示位置
           End If
        End With
    End Sub
    Private Sub DataGridView1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseWheel
        Me.DataGridView1.Controls.Clear()
    End Sub
    Private Sub DataGridView1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridView1.Scroll
         Me.DataGridView1.Controls.Clear()
    End Sub
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        With Me.DataGridView1
            If .Rows.Count > 0 Then
                If Me.Label1.Text.Trim <> "" Then’加个判断,否则很容易出错,
                    .Item(23, .CurrentCell.RowIndex).Value =
                End If
            End If
        End With
    End Sub

[ 本帖最后由 jianjunfeng 于 2014-12-8 09:12 编辑 ]
2014-12-08 09:11
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
感谢jianjunfeng不吝提供完整代码!好人啊!
我也试过把ComboBox加进DataGridView,可惜Scroll表格右侧滑块后ComboBox就上下串行了,
后来试着在表格单元格中定义DataGridViewComboBoxCell,虽然解决了ComboBox出现的上下串行问题,但数据量比较大时,可能会因为null字段值导致DataGridViewComboBoxCell意外出错。
现在jianjunfeng让我知道应该使用GetCellDisplayRectangle这个属性来解决ComboBox在DataGridView中Scroll上下串行的问题了。
认真研究高手的代码,拓展思路开阔视野。再次感谢jianjunfeng

2014-12-08 13:58
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
我发现使用DataGridViewComboBoxCell做出来的下拉组合框的效果与嵌入ComboBox不大一样,
前者组合框下拉出来的列表框要比组合框头宽一些,后者下拉出来的列表框与组合框头宽度一致,对于刚好容纳显示内容的列来说,组合框的箭头会挡住部份内容。

2014-12-09 10:43
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
知道了,ComboBox.DropDownWidth=ComboBox.Width+17  。

[ 本帖最后由 XIHONGSHI 于 2014-12-9 13:07 编辑 ]

2014-12-09 10:51
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
发现一个问题:
采用嵌入ComboBox的方式时,我把ComboBox.Items.Add过程放到了DataGridView1_CellBeginEdit事件中。
假如当前单元格在第3行的客户列,鼠标轮向下滚动一行,这时ComboBox被嵌入到第4行客户列,此时鼠标轮再向下滚动一下,才见到执行MouseWheel的效果,ComboBox消失了,但把第4行客户列单元格本身的文本框编辑状态暴露出来了。此时可以删除客户,或者直接输入新客户名称了,不利于控制

2014-12-09 12:18
XIHONGSHI
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-4-3
得分:0 
可以把DataGridView1_MouseWheel 和 DataGridView1_Scroll 都改为处理ComboBox.Location

ComboBox1_SelectedIndexChanged事件中判断语句
If Me.Label1.Text.Trim <> "" Then’加个判断,否则很容易出错,
Label1起什么作用?  为何加入此判断呢?

[ 本帖最后由 XIHONGSHI 于 2014-12-9 13:37 编辑 ]

2014-12-09 13:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439467-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125651 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved