DataGridView selectionChanged事件多次触发

在我的应用程序中,我使用DataGridView来显示列表。 当用户在datagridview中选择一条记录时,它应该在另一个面板中显示详细信息。 为了选择,我被要求使用DataGridView1_SelectionChanged事件。

DataGridView应该只包含一列,但详细信息显示可能包含所选记录的更多信息(我们可以通过查询所选的主键值来获取数据库中的所有详细信息)。

请告诉我是否可以获取所选DataGridView记录的datakey(主键)。 DataGridView是否会基于主键进行绑定?

编辑

我已经实现了DataGridView1.Columns [“ID”]。Visible = false。 它运作良好。 为了选择我添加了DataGridView1_SelectionChanged事件。

但DataGridView1_SelectionChanged事件多次触发。

在执行代码之前,您可以在selectionchanged事件中使用DataGrid.focused属性,如下所示:

 private void dg_SelectionChanged(object sender, EventArgs e) { if (dg.Focused) { // your code } } 

我今天遇到了同样的问题,经过几个小时的实验,我找到了解决这个问题的解决方案或解决方法

 this.dgvSearchResult.SelectionChanged -= dgvSearchResult_SelectionChanged; this.onSearch(); this.dgvSearchResult.SelectionChanged += new EventHandler(dgvSearchResult_SelectionChanged); 

希望它有所帮助

我尝试过RowEnter事件,但它对我来说很好。 你怎么检查它? 使用消息框或在事件中放置断点。 因为,断点和消息框将从所选行中释放焦点。 然后,当您在messagebox或断点之后继续时,网格将重新聚焦并且事件将再次执行。

尝试以下步骤检查事件执行。 在此处输入图像描述

处理多个执行。

 int LastRowIndex =-1; private void dgv_RowEnter(...) { if (LastRowIndex != e.RowIndex) { //Place your code here. } LastRowIndex = e.RowIndex; } 

如果重置了数据绑定,则可以在填充数据后获得一个SelectionChanged通知列表暂时为空,然后是另一个。 更糟糕的是,自重置之前,所选项目甚至可能没有变化。 我通过在每次调用时检查SelectedCells来validation这一点。

一种解决方案是使用失效变量,并检入Application.Idle事件。 这具有分组更改和避免不必要更新的良好效果。 一旦消息泵为空,Application.Idle就会运行,因此用户不会注意到延迟。 如果在网格自行排序后检查是否需要更改,那就更好了。

您需要在构造函数中设置静态表单实例属性。

 private bool isViewUpToDate = false; private void DataGrid_SelectionChanged(object sender, EventArgs e) => isViewUpToDate = false; public void CheckDataGridSelectionView() { if (isViewUpToDate) return; // Logic goes here isViewUpToDate = true; } static void Main() { Application.Idle += (sender, eventData) => MainForm.Instance?.CheckDataGridSelectionView(); // ... }