选择一行后调用哪个DataGridView事件

时间:2016-11-15 16:09:34

标签: c# datagridview

我的DataGridView包含~200行,每行包含一些用户信息(例如姓氏)。当用户选择任何这些行时,我需要检索所选行的ID,以便查询我的数据库以获取更多信息。因此,当用户选择一行时,我会遍历整个列表,直到我找到匹配的ID。这是可视化我正在谈论的内容的代码:

if (e.RowIndex > -1)
{
    int selectedId = Convert.ToInt32(dataGridView.Rows[e.RowIndex].Cells["IdColumn"].Value);
    foreach (var user in Users)
        if (user.Id == selectedId)
        {
            SelectedUser = GetUserById(user.Id);
            break;
        }
}

现在,我在这里使用的事件是DataGridView.RowEnter,这是一个问题,因为即使第一次加载列表时此事件也会触发,因此至少执行foreach循环一百次 所以问题是:我应该使用哪个事件,以便在选择一行后上面的代码只执行一次?

3 个答案:

答案 0 :(得分:1)

以下是您的问题的解决方案,您可以使用以下事件有效地选择行做我们想要的,我已根据您的代码在下面发布了一个示例,以便更好地理解。

示例:

private void dataGridView_SelectionChanged(object sender, EventArgs e)
    {
    DataGridView gv = sender as DataGridView;
    if (gv != null && gv.SelectedRows.Count > 0)
        {
        DataGridViewRow row = gv.SelectedRows[0];
        if (row != null)
            {
            if(Convert.ToInt32(row.Cells["IdColumn"].Value)==user.Id)
              {

                      //do whatever we want

               }

            }
        }
    }

希望它肯定会有所帮助,如果有任何进一步的澄清或怀疑,请告诉我。快乐分享

感谢 KARTHIK

答案 1 :(得分:1)

Karthik Elumalai刚刚获得第一名但只是为了指出他的解决方案: 你用过

public event DataGridViewCellEventHandler RowEnter
  

当最初加载DataGridView时,以及当用户选择当前行以外的行时,会发生此事件。

msdn Documentation for rowenter

您解释的行为就是这个事件的组成部分。 所以你最好按照Karthik Elumalai的建议来尝试:

public event EventHandler SelectionChanged
  

无论是以编程方式还是通过用户操作,只要选择了单元格或取消选择,就会发生此事件。例如,当您想要显示当前所选单元格的总和时,此事件非常有用。

msdn Documentation for selectionchanged

答案 2 :(得分:1)

@LarsTech在评论中提出了最可行的选项:仅在加载所有数据后连接事件。因为我的数据在加载后被排序,所以我按照这样执行:

private void dataGridView_Sorted(object sender, EventArgs e)
    {
        this.dataGridView.SelectionChanged -= new System.EventHandler(this.dataGridView_SelectionChanged);
        this.dataGridView.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged);
    }

(我还使用@Karthik提供的代码来制作事件SelectionChanged - 而不是基于RowEnter -