如何获取DataGrid单元格的字段

时间:2016-09-22 17:07:14

标签: c# wpf entity-framework

在我的WPF应用程序中,我有一个包含DataGrid的Window(所有代码)。有我的DataGrid绑定:

using (var db = new CompanyEntities())
{
    var stocks = db.Stock;
    var query = from s in stocks
                select new { s.Id_Product, s.Quantity };
    dataGrid.ItemsSource = query.ToList();
} 

我想读取在DataGrid中选择的单元格。我尝试使用DataGrid.SelectedItem读取它,但要获取项目我必须将其转换为某种类型。我不能使用Stock类,因为我的DataGrid单元格包含3个库存中的2个。所以我创建了另一个类来表示DataGrid单元格:

    class TableItem
    {
        public int Id_Product;
        public int? Quantity;
    }

试图像这样施展:

TableItem x = (TableItem)dataGrid.SelectedItem;

但是我从类型

获得InvalidCastException
  

'<> f__AnonymousType0 2[System.Int32,System.Nullable 1 [System.Int32]]'

到我的TableItem类型。

那么我应该如何选择我的dataGrid的单元格呢?

我的解决方法:

在我的CompanyEntites构造函数中,我设置了:

 this.Configuration.ProxyCreationEnabled = false;

现在我可以无异常地转换Stock s = (Stock)dataGrid.SelectedItem;,在关闭ProxyCreation之前,我的SelectedItem是DynamicProxy.Stock ~~ type。

1 个答案:

答案 0 :(得分:2)

更改您的查询:

var query = from s in stocks
            select new TableItem { Id_Product = s.Id_Product, Quantity = s.Quantity };

然后将SelectedItem投射到TableItem,现在它实际上是一个。在C#中,仅仅因为它看起来像另一个类,并不意味着那个其他类。

或者,不要仅因为您不需要现有类的一个属性而编写新类。只需使用现有的类:

//  Don't think you need to call ToList() here
dataGrid.ItemsSource = db.Stock;

...并将SelectedItem投射到任何地方。

  

我的DataGrid单元格包含3个字段中的2个:

那又怎样?问题是你得到一个额外的列?明确定义列,只需要您需要的列。