2012-07-03 67 views
1

2組合框列我使用一個DataGridView與2列的組合框來顯示帳戶中沒有和描述在2005年vb.net添加在datagridview的

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

我填充DS1和DS2與上文使用的DataAdapter查詢。

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個comboboxcolumns的datagridview。顯示任何tbale中的任何2列,如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.** 

回答

0

這可能會給你一個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的新實例表屬性是空的,所以實際上不填充數據集,我想請問你的應用程序不會拋出異常? ds1.tables數組中沒有第0個表。如果這不會引發你的例外,你的程序的執行邏輯就有缺陷。有些東西沒有被調用,應該填充數據集。沒有數據集填充並附加到組合框,那些組合框將是空的,他們的SelectedItem是沒有什麼,這就是爲什麼你得到一個單元格值錯誤。我希望這有幫助。檢查你的代碼。

+0

對不起,我正在用我的問題在頂部給出的查詢填充數據集。 (在dataadapter的幫助下)所以在第0位有表格。 – user1497569

+0

@ user1497569我認爲我們彼此之間有誤解,我看到你在查詢,但是每當你的代碼通過新的數據集行時,你的ds1和ds2變量就會被實例化和初始化,這意味着使用這個空的構造函數,你將它們設置爲基本的空數據集,它沒有表格。如果您在新數據集和cmbcol.datasource之間省略了一些行,那麼請發帖 – Qqbt

+0

Hi Andris。看到我最近的回覆。我無法在此塊中發帖。我在表單加載事件中填充datagridviews。所以它應該只填充一次。如果有添加DataError事件仍然可以選擇acctno,它會正確顯示desc。如果我選擇desc,它會正確顯示acctno。它會捕獲異常「單元格值無效」,如果我clcik幾次仍然工作。 (但是這個例外不斷出現) – user1497569