如何在DataGrid中获取选中行的值?DataGridView方案不适用
在WinForms DataGrid中捕获点击事件并获取选中行的ID值
我完全懂你现在的困扰——WinForms里的DataGrid和DataGridView虽然名字相近,但它们的事件模型和行数据获取方式差异很大,之前用DataGridView的SelectedRows那套逻辑套过来肯定行不通。下面我给你详细说怎么解决这个问题:
核心差异说明
DataGridView是后来推出的增强版控件,自带SelectedRows集合方便获取选中行;但DataGrid是早期的老控件,没有这个集合,它的选中行需要通过CurrentRow(单行选中场景)或者绑定上下文来处理。
方案1:单行选中时,通过SelectionChanged或Click事件获取ID
这是最常用的场景,比如点击某行后获取该行的ID值:
第一步:绑定事件
你可以在窗体初始化代码(比如Form_Load)里给DataGrid绑定事件,或者直接在设计器里双击控件添加事件:
// 初始化DataGrid之后绑定SelectionChanged事件 gridData.SelectionChanged += GridData_SelectionChanged; // 或者绑定Click事件,效果类似 gridData.Click += GridData_Click;
第二步:编写事件处理方法
不管用哪个事件,获取选中行ID的逻辑是一致的——因为DataGrid绑定DataTable时,行数据是以DataRowView的形式存在的,我们需要把CurrentRow转换成这个类型来访问列值:
private void GridData_SelectionChanged(object sender, EventArgs e) { // 先判断是否有选中行,避免空引用异常 if (gridData.CurrentRow != null) { // 转换为DataRowView类型 DataRowView selectedRowView = (DataRowView)gridData.CurrentRow; // 获取ID列的值,注意做类型转换(因为返回的是object) int selectedId = Convert.ToInt32(selectedRowView["ID"]); // 这里就可以使用selectedId做后续逻辑了,比如打印、弹窗或者业务处理 Console.WriteLine($"选中的ID是:{selectedId}"); } } // Click事件的处理逻辑和上面完全一样 private void GridData_Click(object sender, EventArgs e) { if (gridData.CurrentRow != null) { DataRowView selectedRowView = (DataRowView)gridData.CurrentRow; int selectedId = Convert.ToInt32(selectedRowView["ID"]); // 你的业务代码 } }
方案2:处理多行选中的场景
如果你的DataGrid允许多行选中,那需要通过绑定上下文(BindingManagerBase)来遍历所有选中的行:
private void GetAllSelectedIds() { // 获取DataGrid的绑定上下文 BindingManagerBase bindingManager = gridData.BindingContext[gridData.DataSource]; // 遍历所有行,判断是否被选中 foreach (DataRowView rowView in bindingManager.List) { if (bindingManager.IsSelected(rowView)) { int id = Convert.ToInt32(rowView["ID"]); // 处理每个选中的ID,比如添加到集合里 Console.WriteLine($"选中的ID:{id}"); } } }
你可以把这个方法放到SelectionChanged事件里,每次选中变化时自动获取所有选中ID。
内容的提问来源于stack exchange,提问作者Jun Rikson
相关产品推荐
相关产品推荐

