WPF 组合框选择名称使用 ID

问题描述

我有一个 ComboBox,我想在其中使用名称,但是当用户选择名称时,我想选择 ID 而不是名称

这是我的 XAML:

<ComboBox x:Name="cb_tvrtkaID" Height="25" Margin="0,10,0" Loaded="cb_tvrtkaID_Loaded"/>

还有我的 C#:

private void cb_tvrtkaID_Loaded(object sender,RoutedEventArgs e) {
    MSsqlConnect sql = new MSsqlConnect();
    bool sqlIsConnected = sql.Connect();
    string query = "SELECT tvrtkaId,tvrtkaNaziv from sifarnik.tvrtka";
    sqlConnection connection = sql.GetConnection();
            
    if (connection != null) {
        using (connection) {
            try {
                sqlCommand cmd = new sqlCommand(query,connection);
                sqlDataReader reader = cmd.ExecuteReader();
                    
                if (reader.HasRows) {
                    while (reader.Read()) {
                        cb_tvrtkaID.Items.Add(reader["tvrtkaNaziv"].ToString());
                        //cb_tvrtkaID.Items.Add(reader["tvrtkaId"].ToString());
                        cb_tvrtkaID.SelectedItem = reader["tvrtkaId"].ToString();
                        cb_tvrtkaID.displayMemberPath = reader["tvrtkaNaziv"].ToString();

                    }
                }
            }
            catch (Exception ex) {
                Debug.WriteLine(ex);
            }
        }
    }
}

这给了我以下错误

System.Windows.Data Error: 40 : BindingExpression path error: 'Arbet-grad d' property not found on 'object' ''String' (HashCode=-1526763463)'. BindingExpression:Path=Arbet-grad d.o.o.; DataItem='String' (HashCode=-1526763463); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

System.Windows.Data Error: 40 : BindingExpression path error: 'Arbet-grad d' property not found on 'object' ''String' (HashCode=1553220975)'. BindingExpression:Path=Arbet-grad d.o.o.; DataItem='String' (HashCode=1553220975); target element is 'ComboBox' (Name='cb_tvrtkaID'); target property is 'NoTarget' (type 'Object')

如何解决错误,以便显示名称但选择了基础 ID?

解决方法

一般来说,我的建议是用包含名称和 ID 的对象填充您的组合框。然后配置您的组合框以显示对象的名称。

 <ComboBox x:Name="cb_tvrtkaID" Height="25" Margin="0,10,0" Loaded="cb_tvrtkaID_Loaded">
       <ComboBox.ItemTemplate>
               <DataTemplate>
                   <TextBlock Text="{Binding Name}" />
               </DataTemplate>
       </ComboBox.ItemTemplate>
   </ComboBox>

组合框中的对象将通过以下方式定义:


  class cbItem
   {
      public string Name{get;set;}
      public string ID;
      public cbItem(string name,string id)
      { Name=name; ID=id;}
   }

在您的代码中,您将添加以下项目:

 //[...]
   while (reader.Read())
      {
         cbItem myCbItem = new cbItem(reader["tvrtkaNaziv"].ToString(),reader["tvrtkaId"].ToString();
         cb_tvrtkaID.Items.Add(myCbItem );
         
         //from outside this method,you can find the item of your combobox whose ID property is x,simply by iterating or with the help of Linq
         cb_tvrtkaID.SelectedItem = myCbItem;
      }

//[...]

不要忘记每次使用 cb_tvrtkaID.Items.Clear() 从 SQL 加载时清理组合框项。

例如,您可以使用与 cbItem 列表和转换器的绑定来完成上述相同的结果

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...