在我的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。
答案 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个:
那又怎样?问题是你得到一个额外的列?明确定义列,只需要您需要的列。