【问题标题】:How to set selected value from Combobox?如何从组合框中设置选定的值?
【发布时间】:2011-10-05 00:20:09
【问题描述】:

我在 c# windows 窗体中使用组合框。我将项目列表绑定如下:

var employmentStatus = new BindingList<KeyValuePair<string, string>>();

employmentStatus.Add(new KeyValuePair<string, string>("0", "[Select Status]"));
employmentStatus.Add(new KeyValuePair<string, string>("1", "Contract"));
employmentStatus.Add(new KeyValuePair<string, string>("2", "Part Time"));
employmentStatus.Add(new KeyValuePair<string, string>("3", "Permanent"));
employmentStatus.Add(new KeyValuePair<string, string>("4", "Probation"));

employmentStatus.Add(new KeyValuePair<string, string>("5", "Other"));
cmbEmployeeStatus.DataSource = employmentStatus;
cmbEmployeeStatus.ValueMember = "Key";
cmbEmployeeStatus.DisplayMember = "Value";
cmbEmployeeStatus.SelectedIndex = 0;

我将选定的值保存在数据库中,例如 1 或 2。现在我想从数据库项中设置选定的值,例如:

cmbEmployeeStatus.SelectedValue =employee.employmentstatus;     

但是组合框没有被选中。我该怎么做?

【问题讨论】:

  • 我使用了你所有的答案,但组合框没有与文本一起出现。我在 form_Load 中绑定了组合框。我删除了文本出现在组合框中的绑定。为什么?
  • 我认为您分配为 selectedItem 的值不正确。我在下面更新了我的答案。

标签: c# .net winforms data-binding combobox


【解决方案1】:

试试这个

combobox.SelectedIndex = BindingSource.Item(9) where "9 = colum name 9 from table"

【讨论】:

    【解决方案2】:

    试试这个:

    KeyValuePair<string, string> pair = (KeyValuePair<string,string>)this.ComboBox.SelectedItem;
    

    【讨论】:

    • 您必须尝试强制转换此组合框因为 C# 在编译时是静态类型的,所以在声明变量后,它不能再次声明或用于存储另一种类型的值,除非该类型可转换为变量的类型。
    【解决方案3】:

    一个可能的解决方案:

    cmbEmployeeStatus.SelectedValue = cmbEmployeeStatus.Items.FindByText("text").Value;
    

    【讨论】:

      【解决方案4】:

      为了手动设置数据库样式 ComboBoxes 尝试设置数字(内部)和某些文本(可见)之间的关系,我发现您必须:

      1. 将您的项目存储在一个列表中(您很接近 - 除了字符串、字符串 - 需要 int、字符串)
      2. DataSource 属性到列表(你很好)
      3. DataMember,DataValue(你很好)
      4. 加载默认值(你很好)
      5. 从数据库中输入值(您的问题)
      6. 获取值以放回数据库(您的下一个问题)

      首先要做的事情。将您的 KeyValuePair 更改为如下所示:

      (0,"选择") (1,"选项 1")

      现在,当您运行 sql“Select empstatus from employees where blah”并返回一个整数时,您需要设置组合框而不浪费大量时间。

      简单地说:*** SelectedVALUE - 不是项目****

      cmbEmployeeStatus.SelectedValue = 3;   //or
      
      cmbEmployeeStatus.SelectedValue = intResultFromQuery;   
      

      无论您是否像以前那样手动加载了带有代码值的组合框,或者如果您从查询中加载组合框,这都将起作用。

      如果你的外键是整数,(对我来说,它们都是整数),生活很容易。用户对组合框进行更改后,您将存储在数据库中的值是 SelectedValue。 (根据需要转换为 int。)

      这是我将 ComboBox 设置为数据库值的代码:

      if (t is DBInt) //Typical for ComboBox stuff
          {
          cb.SelectedValue = ((DBInt)t).value;
          }
      

      然后检索:

      ((DBInt)t).value = (int) cb.SelectedValue;
      

      DBInt 是 Integer 的包装器,但这是我的 ORM 的一部分,可让我手动控制数据绑定,并减少代码错误。

      为什么我这么晚才回答这个问题?我也在为此苦苦挣扎,因为网上似乎没有关于如何做到这一点的好信息。我想通了,并认为我会很好并将其发布给其他人看。

      【讨论】:

        【解决方案5】:
        cmbEmployeeStatus.Text = "text"
        

        【讨论】:

          【解决方案6】:

          在 windows 应用程序中 我们这样使用

           DDLChangeImpact.SelectedIndex = DDLChangeImpact.FindStringExact(ds.Tables[0].Rows[0]["tmchgimp"].ToString());
           DDLRequestType.SelectedIndex = DDLRequestType.FindStringExact(ds.Tables[0].Rows[0]["rmtype"].ToString());
          

          【讨论】:

            【解决方案7】:

            以下内容适用于您的情况。

            cmbEmployeeStatus.SelectedItem =employee.employmentstatus;
            

            当您将 SelectedItem 属性设置为一个对象时,ComboBox 会尝试使该对象成为列表中当前选定的对象。如果在列表中找到该对象,它将显示在 ComboBox 的编辑部分,并且 SelectedIndex 属性设置为相应的索引。如果列表中不存在该对象,则 SelectedIndex 属性将保留其当前值。

            编辑

            我认为在您的情况下将 Selected Item 设置如下是不正确的。

            cmbEmployeeStatus.SelectedItem =**employee.employmentstatus**;
            

            如下图

            var toBeSet = new KeyValuePair<string, string>("1", "Contract");
            cmbEmployeeStatus.SelectedItem = toBeSet;
            

            您应该分配正确的名称值对。

            【讨论】:

              【解决方案8】:

              我怀疑当您保存到数据库时有些地方不对劲。我是否将您的步骤理解为:

              1. 填充和绑定
              2. 用户选择和项目,点击并保存..然后你保存在数据库中
              3. 现在如果您选择其他项目,它不会选择?

              获得更多代码,尤其是在保存时?在您的代码中初始化和填充绑定列表的位置

              【讨论】:

                【解决方案9】:

                将 SelectedIndex 属性用于组合框中的相应员工状态。

                【讨论】:

                  【解决方案10】:

                  在组合框中设置值

                  cmbEmployeeStatus.Text="Something";
                  

                  【讨论】:

                    【解决方案11】:

                    试试这个。

                    cmbEmployeeStatus.SelectedIndex = cmbEmployeeStatus.FindString(employee.employmentstatus);
                    

                    希望对您有所帮助。 :)

                    【讨论】:

                    • 请记住,FindString 会返回以给定字符串开头的第一个元素,而 FindStringExact 会执行精确的字符串匹配。
                    • 为了安全起见,我更倾向于FindStringExactFindString 在这种情况下有效,但在列表包含类似项目的情况下可能会中断。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-04
                    • 1970-01-01
                    相关资源
                    最近更新 更多