【问题标题】:Dataset Loading a WPF Combobox加载 WPF 组合框的数据集
【发布时间】:2015-05-30 03:04:18
【问题描述】:
DataSet dataSet = new DataSet();
using (SqlConnection connection = new SqlConnection("server=server;   database=database; user id=user; password=user"))
{
     connection.Open();
     using (SqlCommand command = new SqlCommand("SELECT DISTINCT ID FROM TABLE ORDER BY ID ASC", connection))
     {
          SqlDataAdapter reader = new SqlDataAdapter(command);
          reader.Fill(dataSet);
          IDComboBox.DataContext = dataSet; --> This doesn't work
          IDComboBox.Itemsource = dataSet.Tables[0].Columns[0].ToString() --> doesn't work
          IDComboBox.Itemsource = dataSet.Tables[0].Rows[0].ToString() --> doesn't work
          IDComboBox.Itemsource = dataSet.Tables[0].Rows --> doesn't work
          IDComboBox.Itemsource = dataSet.Tables[0].Columns --> doesn't work
          They don't work even with me pairing it the IDComboBox.DataContext = dataSet.Tables[0].Rows[0] or Columns[0]
     }
     connection.Close();
     connection.Dispose();
}

我需要用我的数据表中的数据填充 WPF 中的组合框。我一直在寻找的只是使用 Combobox.Displaymember、Combobox.Source 来执行此操作的示例,但 C# WPF 应用程序没有这些选项。如何使用数据集或数据表中的数据加载 WPF 组合框?

我以前这样做的一种方法是

  using (SqlConnection connection = new SqlConnection("server=server; database=database; user id=user; password=user"))
  {
      connection.Open();
      using (SqlCommand command = new SqlCommand("SELECT DISTINCT ID FROM Table ORDER BY ID ASC", connection))
      {
           SqlDataReader reader = command.ExecuteReader();
           while (reader.Read())
           {
               for (int i = 0; i < reader.FieldCount; i++)
               {
                   IDComboBox.Items.Add(reader[i].ToString());
               }
           }
       }
       connection.Close();
       connection.Dispose();
  }

我知道如果我有大量数据,将它循环到我的组合框中会非常慢,所以我想将它从数据集中转储以减少运行时间。

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    派生自this example,您需要使用ItemSourceDisplayMemberPathSelectedValuePath 属性:

    IDComboBox.ItemsSource = dataSet.Tables[0].DefaultView;
    IDComboBox.DisplayMemberPath = dataSet.Tables[0].Columns["ID"].ToString();
    IDComboBox.SelectedValuePath = dataSet.Tables[0].Columns["ID"].ToString();
    

    xml:

    <ComboBox  Name="IDComboBox" ItemsSource="{Binding}"/> 
    

    【讨论】:

    • 如果不绑定在xml中还能正常工作吗?我添加了这三行,它提取了所有数据并显示在我的组合框中。
    • @Kyle 是的,它会起作用,因为隐含的绑定 is 正在发生。没有明确定义绑定路径的赋值 Property="{Binding}" 默认为 Path 属性 - 本质上意味着“将 this.Property 设置为 this.DataContext 的评估值”,在本例中为 ItemSource
    【解决方案2】:

    WPF ComboBox 有一个您可以使用的 ItemSource 属性。

    IDComboBox.ItemsSource = dataSet.Tables[0].Rows;
    

    【讨论】:

    • 是的,我一直在尝试使用 itemsource。我似乎无法让它打印列中的数据,我所看到的只是如何打印与数据集和数据表本身相关的关于该列的内容。 IDCombobox.Itemsource = dataSet.Tables[0].Columns[0] 那么我不知道什么会给我想要的数据。我可以让它显示列的名称。
    • DataTable.Rows 属性包含带有值的实际 DataRows。您可以使用它来填充ComboBoxItemsSource。或者,您可以遍历行,将值添加到列表中,然后将列表设为 ComboBoxItemsSource
    • 当我做 IDComboBox.ItemsSource = dataSet.Tables[0].Rows 它打印出 System.Data.DataRow 而不是实际数据..
    猜你喜欢
    • 2011-09-28
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多