【问题标题】:Linq-to-SQL combobox bindingLinq-to-SQL 组合框绑定
【发布时间】:2015-02-09 20:08:54
【问题描述】:

我正在尝试使用从linq to sql 检索的list of objects 填充combobox items,方法如下(仅适用于select new)。

注意Tax参数和select new完全一样。

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>

现在我需要解析该值并检索在我填充的组合框中选择的税号。

int selectedTax = ((Tax)CbProductTax.SelectedItem).Id;

由于select new 创建新对象而出现以下错误。我想知道是否有任何方法可以解析最后一步以获取Tax.Id,或者在不使用select new/创建新对象的情况下更好地填充。

附加信息:无法将类型为“f__AnonymousType14[System.Int32,System.String,System.Nullable1[System.Decimal],System.String]”的对象转换为类型“lilka.Tax”。

编辑:

dt = new LilkaDataContext();
var taxes = from p in dt.Taxes select p;
cb.ItemsSource = taxes;

使用此查询,我无法从 GUI 的组合框项目列表中选择项目。它只是不显示为选定项目。

【问题讨论】:

    标签: c# wpf linq linq-to-sql combobox


    【解决方案1】:

    直接从查询中放入数据,而不是创建一个新对象:

    dt = new LilkaDataContext();
    var taxes = from p in dt.Taxes select p;
    cb.ItemsSource = taxes.ToList(); 
    

    【讨论】:

    • 感谢您的建议。我也尝试过使用这种方法,但我无法从 GUI 的 Combobox 项目列表中选择项目。它只是不显示为选定项目。
    【解决方案2】:

    首先让我们谈谈你的组合框:你应该使用SelectedValuePath 属性而不是SelectedValue。所以:

    <ComboBox Name="CbSettingsTax" Grid.Column="2" 
                                  SelectedValuePath="Id"
                                  DisplayMemberPath="Name" />
    

    这样在您的代码中CbSettingsTax.SelectedValue 将返回所选Tax 对象的Id 值,而CbSettingsTax.SelectedItem 将返回整个 所选对象。

    关于 Linq-To-Sql,我看到您使用的是“查询语法”。我个人更喜欢“方法语法”。当你写

    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 属性值复制到新类中。

    但是这种匿名类型与Tax 类型不同。因此,您不能将其转换为 Tax。事实上,税收就是这种匿名类型的集合。它不是 Tax 对象的集合。

    之前我告诉过你我更喜欢 LINQ“方法语法”,因为每个 LINQ 方法都返回一个通用的 IEnumerable。 当然你可以用查询语法得到同样的结果,但是很容易出错。

    如果你使用(例如):

    dt = new LilkaDataContext();
    cb.ItemsSource = dt.Taxes.Where(tax => tax.Name.Contains("VAT"));
    

    您的组合框将包含一组 Tax 对象作为 ItemsSource。

    现在您只需要选择您的方法。您可以使用“方法语法”,然后从组合框中删除 SelectedValuePath 属性。另一方面,您可以继续使用“查询语法”,但在这种情况下,您必须使用 SelectedValuePath 属性,您的代码将是:

    int id = (int)CbProductTax.SelectedValue;
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2010-12-27
      相关资源
      最近更新 更多