【问题标题】:How to select programatically an item in the combo box when using key,value pair使用键值对时如何以编程方式选择组合框中的项目
【发布时间】:2017-02-02 00:22:11
【问题描述】:

当项目定义如下时,有人可以解释我如何以编程方式选择组合框中的项目:

    class ComboboxItem
    {
        public string DisplayString;
        public string Key;

        public ComboboxItem(string key, string displayString)
        {
            Key = key;
            DisplayString = displayString;
        }

        // Generates the text shown in the combo box
        public override string ToString()
        {
            return DisplayString;
        }
    }

组合框会在运行时填充如下项目:

myCombo.Items.Add(new ComboboxItem(“<key>“, “<text_to_display>”));

我需要根据键以编程方式选择一个项目,但我不能使用这里提出的建议:Set the selecteditem of a combobox based on key,value pair.,因为我没有预知数据项目,因为 ComboBox 在运行时被填充。有人可以帮忙吗?非常感谢。

编辑 - 这是一个 winforms 应用程序。

【问题讨论】:

  • 我不得不问你为什么要使用那个类。与仅使用字符串相比,它似乎没有带来任何好处,而且它使某些事情(例如您当前的问题)变得更加复杂。
  • 这是什么应用程序?我的意思是 winforms wpf 还是 web?
  • 坦率地说,我对 c# 还是有点陌生​​,我不知道更好的实现。您能否建议一种更好的方法来添加具有 3 字符代码和文本描述的键的项目。当用户上传某个 XML 文件时,我从 XML 数据中提取 3 个字符代码,然后我需要在组合框中预先选择相应的项目。非常感谢。
  • 这是一个winforms应用,抱歉我忘了说。

标签: c# combobox


【解决方案1】:

试试这样的

comboBox1.Items.Add(new ComboboxItem("a", "a"));
            comboBox1.Items.Add(new ComboboxItem("b", "b"));
            comboBox1.Items.Add(new ComboboxItem("c", "c"));
            comboBox1.Items.Add(new ComboboxItem("d", "d"));

            var key = "c";

            foreach (var item in comboBox1.Items)
            {
                var comboItem = (ComboboxItem) item;
                if (comboItem.Key.Equals(key))
                    comboBox1.SelectedItem = comboItem;
            }

我刚刚制作了一个 Winforms 项目,它工作正常。组合框将“c”显示为选定值

你也可以使用 linq。这可能是一种选择您的项目的方法

public void SelectItem(string key)
        {
            var comboItem = comboBox1.Items
                .Cast<ComboboxItem>()
                .FirstOrDefault(item => item.Key.Equals(key));
            if (comboItem == null)
            {
                //do whatever you want
            }
            else
            {
                comboBox1.SelectedItem = comboItem;
            }
        }

希望对你有帮助

【讨论】:

  • 谢谢taquion,我马上要去上班了,我一到那里就试试你的建议。非常感谢。
  • 完美地完成了这项工作。谢谢。
【解决方案2】:

在查看您的代码时,与必须重新发明轮子相比,这并不是真正的问题。你的ComboboxItem 类看起来很像Dictionary,所以似乎没有必要用你的ComboboxItem 类重新发明这个类。

另一个问题是您的评论……

我需要根据键以编程方式选择一个项目,但我无法使用此处提出的建议:设置 a 的选定项目 基于键值对的组合框。因为我没有预知 在运行时填充 ComboBox 时的数据项。

如果这是真的,那你怎么可能知道选择什么?

下面的代码使用了DictionaryComboBoxTextboxButtonDictionary 填充了一些数据,然后设置为 ComboBox 的数据源。 ComboBox 中仅显示文本。在表单上,​​TextBox 用于允许用户输入一个值,以将ComboBox 的选定值更改为单击Button 时的值。如果Dictionary 中不存在该键,则会显示一条消息,指示未找到索引。

由于您说您不确切知道您可能在寻找什么,我很好奇您希望如何选择合适的索引。希望这是有道理的。

Dictionary<int, string> comboBoxData = new Dictionary<int, string>(); 
public Form1() {

  InitializeComponent();
  comboBoxData = GetDataDictionary();
  comboBox1.DataSource = new BindingSource(comboBoxData, null);
  comboBox1.DisplayMember = "Value";
  comboBox1.ValueMember = "Key";
}

private void SetSelectedIndex(int indexToSelect) {
  if (comboBoxData.Keys.Contains(indexToSelect)) {
    comboBox1.SelectedIndex = indexToSelect;
  }
  else {
    MessageBox.Show("The supplied key does not exist!");
  }
}

private Dictionary<int, string> GetDataDictionary() {
  Dictionary<int, string> dictionary = new Dictionary<int, string>();
  for (int i = 0; i < 15; i++) {
    dictionary.Add(i, "Item name " + i);
  }
  return dictionary;
}

private void buttonSelectIndex_Click(object sender, EventArgs e) {
  if (tbIndexToSelect.Text != "") {
    int indexToSelect = comboBox1.SelectedIndex;
    if (int.TryParse(tbIndexToSelect.Text, out indexToSelect)) {
      SetSelectedIndex(indexToSelect);
    }
  }
}

【讨论】:

  • 感谢您提出的解决方案。数据从入站接口作为 XML 的有效负载提供。当我们收到负载时,我们从负载中推断出组合框的所有值。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2013-12-25
相关资源
最近更新 更多