1

我一直在尝试处理 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 。谁能知道为什么?

谢谢

4

0 回答 0