Linq-to-SQL 组合框绑定
Linq-to-SQL combobox binding
我正在尝试用以下方式从 linq to sql
检索到的 list of objects
填充 combobox items
(这仅对我使用 select new
有效)。
请注意 Tax
参数与 select 新参数完全相同。
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select new
{
Id = p.Id,
Name = p.Name,
Percentage = p.Percentage,
Note = p.Note
};
cb.ItemsSource = taxes;
XAML
<ComboBox Name="CbSettingsTax" Grid.Column="2"
SelectedValue="Id"
DisplayMemberPath="Name" >
</ComboBox>
现在我需要解析该值并检索在我填充的组合框中 selected 的税号。
int selectedTax = ((Tax)CbProductTax.SelectedItem).Id;
并且由于 select new
创建新对象而出现以下错误。我想知道是否有任何方法可以解析最后一步以获取 Tax.Id
或在不 select new
/创建新对象的情况下更好地填充。
Additional information: Unable to cast object of type '<>f__AnonymousType14[System.Int32,System.String,System.Nullable
1[System.Decimal],System.String]' to type 'lilka.Tax'.
编辑:
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select p;
cb.ItemsSource = taxes;
使用此查询,我无法从 GUI 中的组合框项目列表中 select 项目。它只是没有显示为所选项目。
直接从查询中放入数据而不是创建新对象:
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select p;
cb.ItemsSource = taxes.ToList();
首先让我们谈谈您的 ComboBox:您应该使用 SelectedValuePath
属性 而不是 SelectedValue
。所以:
<ComboBox Name="CbSettingsTax" Grid.Column="2"
SelectedValuePath="Id"
DisplayMemberPath="Name" />
这样在您的代码中 CbSettingsTax.SelectedValue
将 return 所选税对象的 ID 值,而 CbSettingsTax.SelectedItem
将 return 整个 选定对象。
关于 Linq-To-Sql,我看到你正在使用 "Query Syntax"。我个人更喜欢"Method Syntax"。当你写
var taxes = from p in dt.Taxes select new
{
Id = p.Id,
Name = p.Name,
Percentage = p.Percentage,
Note = p.Note
};
由于您使用了 new 关键字,编译器会为您创建一个 Anonimous Type,它有 4 个属性,分别称为 Id、Name、Percentage 和 Note。然后 LINQ 将 Tax 属性 值复制到新的 class 值中。
但是这个匿名类型与Tax
类型不同。因此你不能将它转换为 Tax
。实际上 taxes 是这种匿名类型的集合。它不是 Tax 对象的集合。
之前我告诉过你我更喜欢 LINQ "Method Syntax",因为每个 LINQ 方法 return 都是一个通用的 IEnumerable。
当然你可以用查询语法得到同样的结果,但是很容易出错。
如果你使用(例如):
dt = new LilkaDataContext();
cb.ItemsSource = dt.Taxes.Where(tax => tax.Name.Contains("VAT"));
您的组合框将有一个 Tax 对象集合作为 ItemsSource。
现在您只需要选择您的方法。您可以使用 "Method Syntax",然后从您的组合框中删除 SelectedValuePath
属性。另一方面,您可以继续使用 "Query Syntax",但在这种情况下,您必须使用 SelectedValuePath
属性,您的代码将是:
int id = (int)CbProductTax.SelectedValue;
希望对您有所帮助
我正在尝试用以下方式从 linq to sql
检索到的 list of objects
填充 combobox items
(这仅对我使用 select new
有效)。
请注意 Tax
参数与 select 新参数完全相同。
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select new
{
Id = p.Id,
Name = p.Name,
Percentage = p.Percentage,
Note = p.Note
};
cb.ItemsSource = taxes;
XAML
<ComboBox Name="CbSettingsTax" Grid.Column="2"
SelectedValue="Id"
DisplayMemberPath="Name" >
</ComboBox>
现在我需要解析该值并检索在我填充的组合框中 selected 的税号。
int selectedTax = ((Tax)CbProductTax.SelectedItem).Id;
并且由于 select new
创建新对象而出现以下错误。我想知道是否有任何方法可以解析最后一步以获取 Tax.Id
或在不 select new
/创建新对象的情况下更好地填充。
Additional information: Unable to cast object of type '<>f__AnonymousType1
4[System.Int32,System.String,System.Nullable
1[System.Decimal],System.String]' to type 'lilka.Tax'.
编辑:
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select p;
cb.ItemsSource = taxes;
使用此查询,我无法从 GUI 中的组合框项目列表中 select 项目。它只是没有显示为所选项目。
直接从查询中放入数据而不是创建新对象:
dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select p;
cb.ItemsSource = taxes.ToList();
首先让我们谈谈您的 ComboBox:您应该使用 SelectedValuePath
属性 而不是 SelectedValue
。所以:
<ComboBox Name="CbSettingsTax" Grid.Column="2"
SelectedValuePath="Id"
DisplayMemberPath="Name" />
这样在您的代码中 CbSettingsTax.SelectedValue
将 return 所选税对象的 ID 值,而 CbSettingsTax.SelectedItem
将 return 整个 选定对象。
关于 Linq-To-Sql,我看到你正在使用 "Query Syntax"。我个人更喜欢"Method Syntax"。当你写
var taxes = from p in dt.Taxes select new
{
Id = p.Id,
Name = p.Name,
Percentage = p.Percentage,
Note = p.Note
};
由于您使用了 new 关键字,编译器会为您创建一个 Anonimous Type,它有 4 个属性,分别称为 Id、Name、Percentage 和 Note。然后 LINQ 将 Tax 属性 值复制到新的 class 值中。
但是这个匿名类型与Tax
类型不同。因此你不能将它转换为 Tax
。实际上 taxes 是这种匿名类型的集合。它不是 Tax 对象的集合。
之前我告诉过你我更喜欢 LINQ "Method Syntax",因为每个 LINQ 方法 return 都是一个通用的 IEnumerable。 当然你可以用查询语法得到同样的结果,但是很容易出错。
如果你使用(例如):
dt = new LilkaDataContext();
cb.ItemsSource = dt.Taxes.Where(tax => tax.Name.Contains("VAT"));
您的组合框将有一个 Tax 对象集合作为 ItemsSource。
现在您只需要选择您的方法。您可以使用 "Method Syntax",然后从您的组合框中删除 SelectedValuePath
属性。另一方面,您可以继续使用 "Query Syntax",但在这种情况下,您必须使用 SelectedValuePath
属性,您的代码将是:
int id = (int)CbProductTax.SelectedValue;
希望对您有所帮助