C# DataGridView selectionChanged事件多次触发

C# DataGridView selectionChanged事件多次触发,c#,winforms,data-binding,datagridview,selectionchanged,C#,Winforms,Data Binding,Datagridview,Selectionchanged,在我的应用程序中,我使用DataGridView来显示列表。当用户在datagridview中选择记录时,它应该在另一个面板中显示详细信息。对于选择,我被要求使用DataGridView1\u SelectionChanged事件 DataGridView应该只包含一列,但详细信息显示可能包含所选记录的更多信息(我们可以通过使用所选主键值进行查询来获取数据库中的所有详细信息) 请告知是否可以获取所选数据库的数据键(主键) DataGridView记录。DataGridView是否将基于主键进行绑

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

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

请告知是否可以获取所选数据库的数据键(主键) DataGridView记录。DataGridView是否将基于主键进行绑定 ?

编辑

我已经实现了DataGridView1.Columns[“ID”]。Visible=false。它工作得很好。 对于选择,我添加了DataGridView1\u SelectionChanged事件

但DataGridView1\u SelectionChanged事件正在多次触发


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

请尝试执行以下步骤以检查事件执行情况。

处理多次执行

int LastRowIndex =-1;

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

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

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

希望有帮助

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

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

如果数据绑定被重置,您可以得到一个
SelectionChanged
,通知列表暂时为空,然后在填充数据后再出现另一个列表。更糟糕的是,在重置之前,所选项目甚至可能没有更改。我通过在每次通话中检查
SelectedCells
来验证这一点

一种解决方案是使用无效变量,并检入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();

    // ...
}

我建议您为主键字段添加另一列,并通过dgv.CurrentRow.Cells[“colPKField”].Value.检索它。但要求我不要在GridView中显示主键。我认为这也不安全!你说呢?你可以通过将visible属性指定给false来隐藏该列<代码>dgv.Columns[“colPKField”]。可见=假@Nimesh是的,我实现了它,它运行得很好。但当我调用dgv_SelectionChanged事件时,我遇到了一个严重的问题,它被多次解雇。我在SOF中发现其他人也遇到了异常,但没有解释他是如何解决的。请尝试
rownenter
事件。我也尝试了
rownenter
。但它发射了多次。当窗体加载时,甚至当我单击网格的外侧(空白区域)时,它被触发,因此选定的行索引值为0。然后,您可以通过将最后选定的行索引存储在任何变量中来避免多次执行。尊敬!这个问题在Win表单中很常见,您有最简单的解决方案!你能解释一下这房子的用途吗?MSDN文档不够清晰。非常感谢您,您救了我的命;-)伟大的解决方案之一,这些无与伦比的winforms挫折。