2013-02-28 76 views
2

我想基于的价值选择添加到我的第二combobox我在第一comboboxdatagridview(包含textbox列以及)。DataGridView控件修改另一个

这里是我的代码:

Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing 
    Try 
     'Sub Recurrence combobox is selected 
     If DataGridView1.CurrentCell.ColumnIndex = 4 Then 
      'Verify what is chosen in the Recurrence textbox 
      Dim rowIndex = DataGridView1.CurrentCell.RowIndex 
      Dim FirstComboboxValue = DataGridView1(3, rowIndex).Value 

      If Not IsNothing(FirstComboboxValue) Then 
       Dim cmb As ComboBox = TryCast(e.Control, ComboBox) 
       RemoveHandler cmb.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged) 
       AddHandler cmb.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged) 
      End If 
     End If 
    Catch ex As Exception 
     MsgBox(ex.ToString()) 
    End Try 
End Sub 

我处理火朝ComboBox_SelectedIndexChanged事件触发:

Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) 
    If DataGridView1.CurrentCell.ColumnIndex = 4 Then 
     Dim comboBox As ComboBox = CType(sender, ComboBox) 
     Dim cbCell As DataGridViewComboBoxCell = DirectCast(DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(4), DataGridViewComboBoxCell) 
     Dim rowIndex = DataGridView1.CurrentCell.RowIndex 
     Dim FirstComboboxValue = DataGridView1(3, rowIndex).Value 

     'Clear items so they don't keep adding on each other 
     cbCell.Items.Clear() 

     Select Case FirstComboboxValue 
      Case "Choice1" 
       cbCell.Items.Add("Item1") 
       cbCell.Items.Add("Item2") 
      Case "Choice2" 
       cbCell.Items.Add("Item3") 
       cbCell.Items.Add("Item4") 
      Case "Choice3" 
       cbCell.Items.Add("Item5") 
      Case "Choice4" 
       cbCell.Items.Add("Item6") 
       cbCell.Items.Add("Item7") 
     End Select 

     'Remove event handler to prevent memory leak 
     RemoveHandler comboBox.SelectedIndexChanged, AddressOf ComboBox_SelectedIndexChanged 
    End If 
End Sub 

出于某种原因,当我用一个破发点,并通过程序步骤中,仅在第二次尝试打开“项目”combobox时第二次添加项目combobox

如果我尝试在没有调试的情况下运行程序,则不显示任何内容。任何想法我做错了什么?

回答

1

如果在ComboBox中使用SelectedIndexChanged,则即使未单击ComboBox,也可能遇到事件被触发的问题。

当您打开和关闭Windows窗体时会发生这种情况。

通过使用SelectionChangeCommitted事件来获得更好的效果。

SelectionChangeCommitted事件发生在所选项目已更改并且该更改显示在组合框中。

通过使用SelectionChangeCommitted事件,您不需要声明RemoveHandler和AddHandler语句。


另一种可能性:

手柄试试吧cmb.SelectedIndexChanged

有几种方法在VB.NET声明事件。通常使用的是句柄关键字。

Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, 
      ByVal e As EventArgs) Handles cmb.SelectedIndexChanged 
+0

感谢您的回复!不幸的是,由于该方法在我的EditingControlShowing事件之外被声明,所以会出错。它不知道该怎么办“cmb” – Alex 2013-02-28 15:01:45

+0

我知道这将适用于一个正常的组合框控件。问题是我们正在处理一个DataGridViewComboBoxColumn,他们需要处理程序才能工作 – Alex 2013-02-28 15:42:22

+0

你试过了:SelectionChangeCommitted事件与addHandler和removeHandler? – 2013-02-28 15:58:51

相关问题