C#2组合框具有相同但不是两次可选择的内容

时间:2014-08-21 11:06:03

标签: c# winforms combobox

我有一个对话框表单,用户必须从中选择要用于绘制图形的文本文件中的哪些列。

如果有人不太明白我的意思,请查看以下示例:

  • 对话框打开
  • 用户选择例如他的图表的x值应来自文本文件的第二列
  • 用户选择例如他的图的y值应来自文本文件的第三列
  • 用户点击“确定”

我遇到的问题如下:

我想阻止用户为x和y值选择相同的列,这会导致角度大约为45度的线条,并使图形无用。

两个组合框都填充了相同的字符串数组,其中包含文本文件中列的标题。将这些字符串放入组合框中效果很好,但是:

我尝试从另一个组合框中删除在一个组合框中选择的项目,否则。 在此之前,当前选定的项目存储在变量中,项目将重置为默认状态,这意味着文本文件中的所有标题

但是,当我以编程方式将索引设置为之前的位置,以便用户不必这样做时, SelectedIndexChanged 事件会在无限循环中触发并捕获我的代码。

public void setComboboxText()
{
    cbX.Items.Clear();
    cbY.Items.Clear();
    cbX.Items.AddRange(cbText);
    cbY.Items.AddRange(cbText);
}

void CbXSelectedIndexChanged(object sender, EventArgs e)
{
    var item = cbX.SelectedItem;
    setComboboxText();
    cbX.SelectedItem = item;
    cbY.Items.Remove(cbX.SelectedItem);
}

void CbYSelectedIndexChanged(object sender, EventArgs e)
{
    var item = cbY.SelectedItem;
    setComboboxText();
    cbY.SelectedItem = item;
    cbX.Items.Remove(cbY.SelectedItem);
}

代码执行以下操作:

  • 暂时存储当前所选项目
  • 组合框中的项目已重置
  • 当前所选项目设置为
  • 之前的项目存储
  • 在更改框中选择的项目将从其他组合框
  • 中消失

任何帮助表示感谢,特别是如果有人可以告诉我是否可以通过其他活动或甚至没有活动来做我想做的事情。

提前致谢

1 个答案:

答案 0 :(得分:0)

我认为这是你想要实现的目标。

public partial class Form1 : Form
{
    List<string> source1 = new List<string>();
    List<string> source2 = new List<string>();
    public Form1()
    {
        InitializeComponent();

        for (int i = 0; i < 10; i++)
        {
            source1.Add("item" + i);
            source2.Add("item" + i);
        }

        comboBox1.Items.AddRange(source1.ToArray());
        comboBox2.Items.AddRange(source2.ToArray());
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox2.Items.Contains(comboBox1.SelectedItem))
        {
            comboBox2.Items.Clear();
            List<string> updatedList = new List<string>();
            updatedList = (from x in source2
                           where !x.Equals(comboBox1.SelectedItem)
                           select x).ToList<string>();
            comboBox2.Items.AddRange(updatedList.ToArray());
        }

    }


    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.Items.Contains(comboBox2.SelectedItem))
        {

            comboBox1.Items.Clear();
            List<string> updatedList = new List<string>();
            updatedList = (from x in source1
                           where !x.Equals(comboBox2.SelectedItem)
                           select x).ToList<string>();
            comboBox1.Items.AddRange(updatedList.ToArray());
        }
    }


}
  • 使源集合可用于每个组合框SelectedIndexChanged处理程序
  • 每次选择更改时,只有在其他组合框项目中存在新选择的项目时,才更新其他组合框的来源。