【问题标题】:How to get selected index from selected value in combo box C#如何从组合框中的选定值中获取选定的索引C#
【发布时间】:2020-01-21 11:28:56
【问题描述】:

是否有任何内置方法可以从 ComboBox 控件 C# 中的选定值中获取选定索引。如果没有,我该如何构建自己的

提前致谢

【问题讨论】:

  • 老问题,但需要正确答案,无论数据源类型如何(DataTable、Lits、...)。看看this post

标签: c# winforms combobox


【解决方案1】:

我认为您正在寻找 SelectedIndex 属性。

int index = comboref.SelectedIndex

当您正在寻找特定值的索引而不是您可以选择的索引时

int index = comboref.Items.IndexOf("string");

它会告诉你哪个索引在组合框上有“字符串”

【讨论】:

  • 不,我想要的是从值中获取索引。即:int seletedIndex = comboBox.getIndexFromKnownSelectedValue(value)
  • 不,我有一个值,我想要一个与该值对应的索引
  • 希望这就是你要找的东西
【解决方案2】:

您可以使用combobox1.Items.IndexOf("string"),它将返回指定项目集合中的索引

或使用combobox1FindString("string")findExactString("string") 将返回指定项目的第一次出现。您还可以为其提供与startIndex 对应的第二个参数,以从该索引开始搜索。

希望我回答了你的问题!!

【讨论】:

    【解决方案3】:

    OP:我想要的是从价值中获取索引。即:int seletedIndex = comboBox.getIndexFromKnownSelectedValue(value)

    按值获取项目按值获取索引

    您需要扫描项目并根据SelectedValue 字段为每个项目获取值,然后获取项目的索引。为此,您可以使用此GetItemValue 扩展方法并以这种方式获取项目和索引:

    //Load sample data
    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.DataSource = Enumerable.Range(1, 5)
            .Select(x => new { Name = $"Product {x}", Id = x }).ToList();
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Id";
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        //Knows value
        var value = 3;
    
        //Find item based on value
        var item = comboBox1.Items.Cast<Object>()
            .Where(x => comboBox1.GetItemValue(x).Equals(value))
            .FirstOrDefault();
    
        //Find index 
        var index = comboBox1.Items.IndexOf(item);
    
        //Set selected index
        comboBox1.SelectedIndex = index;
    }
    

    【讨论】:

      【解决方案4】:

      不,没有任何内置方法可以从 ComboBox 控件 C# 中的选定值中获取选定索引。 但是您可以创建自己的函数来获得相同的效果。

      用法:

      int index = CmbIdxFindByValue("YourValue", YourComboBox);
      

      功能:

      private int CmbIdxFindByValue(string text, ComboBox cmbCd)
      {
          int c = 0;
          DataTable dtx = (DataTable)cmbCd.DataSource;
          if (dtx != null)
          {
              foreach (DataRow dx in dtx.Rows)
              {
                  if (dx[cmbCd.ValueMember.ToString()].ToString() == text)
                      return c;
                  c++;
              }
              return -1;
          } else
              return -1;
      
      }
      

      【讨论】:

      • 虽然在数据源为数据表的情况下可能有效,但对于其他情况则无效。看看this post,它展示了如何从项目中获取价值。然后找到可以使用这样的 linq 查询的项目:var item = comboBox1.Items.Cast&lt;Object&gt;() .Where(x =&gt; (int)comboBox1.GetItemValue(x) == value) .FirstOrDefault(); 并获取索引var index = comboBox1.Items.IndexOf(item);
      • @RezaAghaei 您的解决方案帮了大忙。
      • @NorbertBoros 很高兴听到这有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多