我一直在尝试处理 WPF DataGrid 控件的SelectedCellsChanged事件,以便能够在其行的选择事件中填充 DataGrid 中的某些字段。当我使用 Ado.net 并将数据作为 DataTable 绑定到网格时,它在以前的项目中运行良好。但是当我开始使用 Linq 并将数据绑定为 var 或列表时,出现了问题。
这是我填充网格的代码:
private void fill_data_grid() { var items = from it in dc.items orderby it.date_added descending select it; dg_items.ItemsSource = items; }
这是我要处理其单元格选择事件的 DataGrid的XAMl代码
<DataGrid Margin="374,133,10,61" x:Name="dg_items"
SelectedCellsChanged="dg_items_SelectedCellsChanged"
Loaded="dg_items_Loaded">
</DataGrid>
这是事件处理程序:
private void dg_items_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { try { DataRowView _DataView = this.dg_items.CurrentCell.Item as DataRowView; //Problem Happens up here *************************************** if (_DataView != null) { txt_code.Text = _DataView.Row["code"].ToString(); txt_name_ar.Text = _DataView.Row["name_ar"].ToString(); txt_name_en.Text = _DataView.Row["name"].ToString(); txt_international_code.Text = _DataView.Row["icode"].ToString(); txt_supplier_name.Text = _DataView.Row["supplier"].ToString(); cb_supplierType.Text = _DataView.Row["supplier_type"].ToString(); cb_producer_comp.Text = _DataView.Row["producer_company"].ToString(); cb_producer_comp.Text = _DataView.Row["medical_group"].ToString(); cb_material.Text = _DataView.Row["material"].ToString(); txt_restrictions.Text = _DataView.Row["restrictions"].ToString(); txt_side_effects.Text = _DataView.Row["side_effects"].ToString(); cb_bigUnit.Text = _DataView.Row["bigger_unit"].ToString(); cb_smallUnit.Text = _DataView.Row["small_unit"].ToString(); cb_medical_shape.Text = _DataView.Row["pharma_type"].ToString(); dp_production_date.Text = _DataView.Row["date_produced"].ToString(); dp_expire_date.Text = _DataView.Row["date_expire"].ToString(); txt_amount_of_unit.Text = _DataView.Row["amount_in_unit"].ToString(); cb_item_type.Text = _DataView.Row["cat"].ToString(); txt_notes.Text = _DataView.Row["notes"].ToString(); txt_price_per_unit.Text = _DataView.Row["price"].ToString(); txt_reduction_main.Text = _DataView.Row["main_reduction"].ToString(); txt_reduction_extra.Text =_DataView.Row["extra_reduction"].ToString(); txt_tax.Text = _DataView.Row["tax"].ToString(); txt_amount_of_units.Text = _DataView.Row["amount"].ToString(); txt_limit_of_reordering.Text=_DataView.Row["limit_of_order"].ToString(); txt_quick_access.Text = _DataView.Row["quick_access_code"].ToString(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
将当前单元格项的实例作为DataRowView时会出现问题
DataRowView _DataView = this.dg_items.CurrentCell.Item as DataRowView;
尽管 CurrentCell.Item 在其列中具有值,但 DataView 为空。
我已经使用 ADO.Net 尝试了相同的代码并且它有效..
以下代码是我之前的 ADO.Net 代码
private void FillDataGrid() { UserDAO doa = new UserDAO(); dataGrid1.ItemsSource = doa.GetEmps().DefaultView; }
其中 GetEmp() 返回一个 DataTable。
所以我不知道为什么在选择 DataGrid 的行时它会给出 null 。谁能知道为什么?
谢谢