WPF C#如何获取DataGrid选中行值显示到TextBox,转DataRowView为空怎么办
原因分析
- 类型不匹配:
as运算符在类型转换失败时会直接返回null,此问题90%以上的场景都是因为DataGrid的ItemsSource绑定的数据源类型不是DataView/DataTable:如果你的数据源是List<自定义业务类>、ObservableCollection<T>这类泛型集合,SelectedItem的实际类型就是泛型对应的实体类,自然无法转换为DataRowView。 - 选中状态为空:触发
SelectionChanged事件时可能没有处于有效选中状态,比如页面首次加载未选中任何行、点击DataGrid空白区域取消选中、开启多选模式后全部取消选中时,SelectedItem本身就是null,转换后自然也是null。 - 强类型DataSet适配问题:如果使用强类型DataSet作为数据源,选中项的类型是强类型DataRow而非
DataRowView,转换也会失败。
解决方法
- 先调试确认
SelectedItem的实际类型:在第4行打断点,查看grid.SelectedItem的运行时类型,根据实际类型做转换即可。 - 如果是绑定的自定义实体类(例如类名为
Product),直接修改转换逻辑:
private void dataGridView_SelectionChanged(object sender, SelectionChangedEventArgs e) { DataGrid grid = (DataGrid)sender; Product selectedProduct = grid.SelectedItem as Product; if (selectedProduct != null) { comboBoxCategory.Text = selectedProduct.Category; textBoxBrand.Text = selectedProduct.Brand; textBoxName.Text = selectedProduct.Name; textBoxCount.Text = selectedProduct.Count.ToString(); textBoxPrice.Text = selectedProduct.Price.ToString(); } }
- 如果确认要绑定
DataTable并使用DataRowView,请确保给DataGrid赋值数据源时写法正确:
// 正确写法,显式指定用DataView绑定 dataGrid.ItemsSource = yourDataTable.DefaultView;
- 无需删除现有
if (selected_row != null)判断,这个判断可以避免未选中行时的空引用报错。
内容的提问来源于stack exchange,提问作者Futurex
相关产品推荐
相关产品推荐

