2017-01-16 26 views
0

我有一个DataGridView,包括一个DataGridViewButtonColumn。用户应该能够直接使用按钮,因此我将EditMode设置为EditOnEnter。但是,第一次点击并没有激发Click事件 - 看起来第一次点击选择/聚焦行/列?DataGridView中手动触发按钮单击事件

于是,我就用CellClick事件:

Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick 

Dim validClick = (e.RowIndex <> -1 And e.ColumnIndex <> -1) 
If (TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewButtonColumn And validClick) Then 
    dgv.BeginEdit(True) 
    CType(dgv.EditingControl, Button).PerformClick() 
End If 

End Sub 

但这种方法也不能工作。 EditingControl总是抛出一个NullReferenceException

任何想法?

+1

看一看答案[这里](http://stackoverflow.com/questions/3577297/how-to-handle-click-event-in-button-column-in-datagridview)。这是一个C#的问题,但答案转换为VB.NET,所以你应该能够从中挑选出一些位。 – Bugs

+0

谢谢,我看到了这个问题。问题不在于运行任何函数/方法/事件 - 问题是,即使DataGridView EditMode是EditOnEnter **,**第一次单击始终关注该行并且不会触发CellClick/CellContentClick事件。有什么解决方法吗?每当用户点击一个DataGridViewButtonColumn时,DataGridViewButtonColumn背后的代码应该会触发...... – tmieruch

回答

1

我不认为当点击一个DataGridViewButtonColumn单元时,有一个特定的事件可以处理。 DataGridViewCell_ClickedCellContentClicked事件被解雇。

我无法获得点击进入DataGridView的延迟,然后再次点击以启动按钮。当我点击DataGridView按钮单元时,立即启动了Cell_Clicked事件。更改DataGridViewEditMode没有什么区别。下面的代码简单地标识了从Cell_Clicked事件中点击了WHICH单元。如果单击的单元格是按钮列(1或2),则我调用创建的方法ButtonHandler来处理按下哪个按钮并继续按正确的按钮方法。希望这可以帮助。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { 
    if (e.ColumnIndex == 1 || e.ColumnIndex == 2) { 
    // one of the button columns was clicked 
    ButtonHandler(sender, e); 
    } 
} 

private void ButtonHandler(object sender, DataGridViewCellEventArgs e) { 
    if (e.ColumnIndex == 1) { 
    MessageBox.Show("Column 1 button clicked at row: " + e.RowIndex + " Col: " + e.ColumnIndex + " clicked"); 
    // call method to handle column 1 button clicked 
    // MethodToHandleCol1ButtonClicked(e.RowIndex); 
    } 
    else { 
    MessageBox.Show("Column 2 button clicked at row: " + e.RowIndex + " Col: " + e.ColumnIndex + " clicked"); 
    // call method to handle column 2 button clicked 
    // MethodToHandleCol2ButtonClicked(e.RowIndex); 
    } 
}