【问题标题】:adding 2 combobox columns in datagridview在 datagridview 中添加 2 个组合框列
【发布时间】:2012-07-03 04:03:56
【问题描述】:

我正在使用带有 2 个组合框列的 datagridview 在 vb.net 2005 中显示帐号和描述。

my query = "select acctno, acctdesc from mytable union select ' ','' from mytable" (why union? - so that once user selects acct no, can deselect)

我正在使用 dataadapter 用上面的查询填充 ds1 和 ds2。

dim ds1 as new dataset
cmbcol1.datasource = ds1.tables(0).defaultview
cmbcol1.DisplayMember = "Acctno"
cmbCol1.ValueMember = "Acctno"

-----------------

dim ds2 as new dataset
cmbcol2.datasource = ds2.tables(0).defaultview
cmbcol2.DisplayMember = "Acctdesc"
cmbCol2.ValueMember = "Acctno"

-----------------

My code - 


    Private Sub dgvAcctSelect_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvAcctSelect.EditingControlShowing

            Try
                If dgv.CurrentCell.OwningColumn.Name = "ACCTNO" Then
                    Dim combo As ComboBox = TryCast(e.Control, ComboBox)
                    If combo IsNot Nothing Then
                        RemoveHandler  combo.SelectedIndexChanged,  
                                   AddressOf  combo_SelectedIndexChangedACCT
                        AddHandler  combo.SelectedIndexChanged, 
                                   AddressOfcombo_SelectedIndexChangedACCT
                    End If
                End If

                If dgv.CurrentCell.OwningColumn.Name = "ACCTDESC" Then
                    Dim combo As ComboBox = TryCast(e.Control, ComboBox)
                    If combo IsNot Nothing Then
                       RemoveHandler combo.SelectedIndexChanged, AddressOf 
                               combo_SelectedIndexChangedDESC
                       AddHandler combo.SelectedIndexChanged, AddressOf 
                               combo_SelectedIndexChangedDESC
                    End If
                End If

            Catch ex As Exception
            End Try

        End Sub

' IF USER SELECTS ACCTNO THEN AUTOMATICALLY CORRESPONDING ACCTDESC should be get selected IN OTHER COLUMN


     Private Sub combo_SelectedIndexChangedACCT(ByVal sender As Object, ByVal e As EventArgs)
            Try
                If dgv.CurrentCell.OwningColumn.Name = "ACCTCNO" Then
                    Dim cb As ComboBox = DirectCast(sender, ComboBox)
                    dgv.CurrentRow.Cells(1).Value = cb.SelectedValue
                End If
            Catch ex As Exception
            End Try

        End Sub



' IF USER SELECTS ACCTDESC THEN AUTOMATICALLY SELECT CORRESPONDING ACCTNO should be get selected IN OTHER COLUMN

    Private Sub combo_SelectedIndexChangedDESC(ByVal sender As Object, ByVal e As EventArgs)
        Try
            If dgvAcctSelect.CurrentCell.OwningColumn.Name = "ACCTDESC" Then
                Dim cb As ComboBox = DirectCast(sender, ComboBox)
                dgv.CurrentRow.Cells(0).Value = cb.SelectedValue
            End If
        Catch ex As Exception
        End Try

    End Sub

这是给单元格值无效的错误。


如果有人只想尝试,只需使用带有 2 个组合框列的 datagridview。显示任何 2 列,如任何 tbale 中的 id 和 desc。并尝试在其他列中自动选择 id 并显示 desc。反之亦然


        Dim cmbCol1 As New DataGridViewComboBoxColumn
    Dim ds1 As DataSet
    Dim da1 As Data.SqlClient.SqlDataAdapter
    Try
        ds1 = New DataSet
        da1 = New Data.SqlClient.SqlDataAdapter("SELECT ACCTDESC ,ACCTNO FROM mytable union " & _
        "select ' ' as ACCTNO,'' as ACCTDESC from mytable order by ACCTno", sqlCon)
        ds1.Clear()
        da1.Fill(ds1, "ConnToSqlDrp1")
        If ds1 Is Nothing = False Then
            cmbCol1.DataSource = ds1.Tables("ConnToSqlDrp1").DefaultView
            cmbCol1.DisplayMember = "ACCTno"
            cmbCol1.ValueMember = "SACCTno"
        End If
    Catch ex As Exception
    End Try
    cmbCol1.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
    cmbCol1.HeaderText = "Account No"
    cmbCol1.Name = "ACCTno"
    cmbCol1.Width = 150
    cmbCol1.AutoComplete = True
    .Add(cmbCol1)

    Dim cmbCol2 As New DataGridViewComboBoxColumn
    Dim ds2 As DataSet
    Dim da2 As Data.SqlClient.SqlDataAdapter
    Try
        ds2 = New DataSet
        da2 = New Data.SqlClient.SqlDataAdapter("SELECT ACCTNO,ACCTDESC FROM MYTABLE union " & _
       "select ' ' as ACCTNO,'' as ACCTDESC from MYTABLE order by ACCTDESC", sqlCon)
        ds2.Clear()
        da2.Fill(ds2, "ConnToSqlDrp2")
        If ds2 Is Nothing = False Then
            cmbCol2.DataSource = ds2.Tables("ConnToSqlDrp2").DefaultView
            cmbCol2.DisplayMember = "ACCTDESC"
            cmbCol2.ValueMember = "ACCTNO"
        End If
    Catch ex As Exception
    End Try
    cmbCol2.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
    cmbCol2.HeaderText = "Consol Account Description"
    cmbCol2.Name = "ACCTDESC"
    cmbCol2.Width = 330
    cmbCol2.AutoComplete = True
    'cmbCol2.Visible = False
    .AdDcmbCol2)   



         **THIS IS MY CODE IN FORM LOAD EVENT SO IT SHOULD POPULATE ONLY ONCE.**

【问题讨论】:

    标签: vb.net datagridview datagridcomboboxcolumn


    【解决方案1】:

    这可能会给您一个 IndexOutOfBounds 异常。实际上它应该给它两次。

    dim ds1 as new dataset
    cmbcol1.datasource = ds1.tables(0).defaultview
    
    dim ds2 as new dataset
    cmbcol2.datasource = ds2.tables(0).defaultview
    

    当您创建 Data.DataSet 的新实例时,tables 属性为空,因此没有实际填充数据集,我想知道您的应用程序如何不抛出异常? ds1.tables 数组中没有第 0 个表。如果这没有给您抛出异常,那么您的程序的执行逻辑就有缺陷。有些东西没有被调用,并且应该填充数据集。如果没有填充数据集并将其附加到组合框,这些组合框将为空,它们的 SelectedItem 什么都不是,这就是您收到单元格值错误的原因。我希望这有帮助。检查您的代码。

    【讨论】:

    • 对不起,我正在用我在上面的问题中给出的查询填充数据集。 (在dataadapter的帮助下)所以第0个位置有表格。
    • @user1497569 我认为我们彼此误解了,我看到您查询,但是每次您的代码通过 New dataset 行时,您的 ds1 和 ds2 变量都会被实例化和初始化,这意味着有了这个空构造函数,您将它们设置为没有表的基本空数据集。如果您在新数据集和 cmbcol.datasource 之间省略了一些行,那么请同时发布
    • 嗨,安德里斯。看我最新的回复。我不能在这个街区发帖。我在表单加载事件中填充 datagridviews。所以它应该只填充一次。如果添加了 DataError 事件我仍然可以选择 acctno,它将正确显示 desc。如果我选择 desc,它将正确显示 acctno。如果我 clcik 几次它仍在工作,它将捕获异常“单元格值无效”。 (但这个异常不断出现)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2014-09-11
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多