DataGridView ComboBox列事件SelectedindexChanged

时间:2013-05-21 12:06:47

标签: c# vb.net visual-studio-2010 events datagridview

在数据网格视图中有五列

1 - 产品ID 2-产品名称3-描述4-Price和第五个是
选择国家,即组合柱

DataGridView1.Columns.Add("ID", "Product ID")
    DataGridView1.Columns.Add("Name", "Product Name")
    DataGridView1.Columns.Add("Description", "Description")
    DataGridView1.Columns.Add("Price", "Price")


 Dim datagridviewcol As New DataGridViewComboBoxColumn
    datagridviewcol.Items.Add("Pak")
    datagridviewcol.Items.Add("KUI")
    datagridviewcol.Name = "Select"
    DataGridView1.Columns.Add(datagridviewcol)

我在datagridview editingcontrolshowing中添加处理程序selectedindexchanged,如

 Private Sub DataGridView1_EditingControlShowing(ByVal sender As System.Object, ByVal e           As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    If Me.DataGridView1.CurrentCell.ColumnIndex = 4 Then
        Dim cb As ComboBox = CType(e.Control, ComboBox)
        AddHandler cb.SelectedIndexChanged, AddressOf ComboBox_SelectedIndexChanged

    End If

End Sub

selectedindexchanged事件,如

Private Sub ComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    If CType(sender, ComboBox).SelectedIndex = 0 Then
        MessageBox.Show("PAK")
    Else
        MessageBox.Show("KUI")
    End If

End Sub

它运行良好,但如果你在datagridview第4行,那么消息框4次提示你 如果你从第15行选择“PAK”,那么messagebox将提示15次,我只需要1次提示。

帮助我。因此,独立于行的消息框显示的时间不会超过行号。

1 个答案:

答案 0 :(得分:1)

这是因为每次组合框显示你正在向它添加事件,所以它会触发x次。

If Me.DataGridView1.CurrentCell.ColumnIndex = 4 Then
    Dim cb As ComboBox = CType(e.Control, ComboBox)
    RemoveHandler cb.SelectedIndexChanged, AddressOf ComboBox_SelectedIndexChanged //remove handler if it was added before
    AddHandler cb.SelectedIndexChanged, AddressOf ComboBox_SelectedIndexChanged

End If

这样您就可以删除附加到ComboBox.SelectedIndexChanged的任何处理程序。

来自MSDN

  

DataGridView控件一次托管一个编辑控件,和   只要单元格类型没有改变,就重复使用编辑控件   编辑之间。将事件处理程序附加到编辑控件时   因此,您必须采取预防措施,以避免附加相同的   处理程序多次。要避免此问题,请从中删除处理程序   将处理程序附加到事件之前的事件。这将   如果处理程序已附加到事件,则防止重复,   但是否则没有效果。有关更多信息,请参阅   DataGridViewComboBoxEditingControl类概述中的示例代码。