我的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
循环一百次
所以问题是:我应该使用哪个事件,以便在选择一行后上面的代码只执行一次?
答案 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
无论是以编程方式还是通过用户操作,只要选择了单元格或取消选择,就会发生此事件。例如,当您想要显示当前所选单元格的总和时,此事件非常有用。
答案 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
-