从 LINQ 填充的 DataGrid 的 SelectedItem 事件中提取数据

Extract the data from a SelectedItem event from a LINQ filled DataGrid

我在数据库中有一个 table "Cards" table "Cards" 和 "Customers"。 Cards 包含 CustomerID、Number 和 Ammount。之后,我用ADO.NET来利用DataGridTextBox

我删除了 DataGridTextBox 作为搜索条件。按下按钮时,DataGrid 会加载 LINQ:

string searchString = this.CustomerIDTextBox.Text();
using (var ctx = new bdCustomerEntities()){
    var result = from t in ctx.Cards
                 join t_customer in ctx.Customer on t.CustomerID equals t_customer.id
                 where t.CustomerID == searchString
                 select new
                 {
                     number = t.number,
                     ammount = t.ammount,
                     CustomerID = t.Customer.id
                 };
    /*Fill datagrid*/
    this.CardsDataGrid.ItemsSource = result.ToList();
}

当我在 CardsDataGrid 到 select 行中创建一个 MouseDoubleClick 事件并填充两个 TextBoxes 时,问题就来了,一个是 Ammount 数据,另一个是另一个是 Number.

我试过这段代码,但它无法在 TextBoxes:

中显示数据
Cards selected = this.cardsDataGrid.SelectedItem as Cards;
this.numberTextBox.Text = selected.Number.ToString();
this.ammountTextBox.Text = seleccionado.Ammount.ToString();

我在 Cards selected = ... 行之后做了一个 MessageBox.Show 来查看 SelectedItem 上的内容,它显示的是这样的:

{number = 13, ammount = 3500 , CustomerID = 1456 }

我的问题是,由于创建的格式,我无法 "extract" SelectedItem - 也许是 LINQ? - 并将其放入 TextBoxes.

当我对上面的代码进行此更改时,我注意到了一些事情:

Cards selected = (Cards) this.cardsDataGrid.SelectedItem ;

显示:

System.InvalidCastException:Unable to cast object of type '[System.Int32,System.Int32,System.String]' to type 'bdCustomer.Cards'.

在您的查询结果中,您 return 是匿名类型而不是 Cards 类型,这就是您收到 InvalidCastException 的原因。
您可以 return 来自 DBSet 的卡片类型:

from t in ctx.Cards
join t_customer in ctx.Customer on t.CustomerID equals t_customer.id
where t.CustomerID == searchString
select t;

您的 LINK 正在返回一个匿名类型而不是 Cards 类型,并且在匿名类型和 Cards 类型之间没有可用的转换,这就是错误所在告诉你。

将您的 LINQ 更改为:

var result = from t in ctx.Cards
             join t_customer in ctx.Customer on t.CustomerID equals t_customer.id
             where t.CustomerID == searchString
             select t;