如何在两个(更多)列表框中选择相同的索引?

时间:2014-03-13 08:25:13

标签: c# .net windows winforms listbox

请参阅,我有两个listboxes: listBox1, listBox2,都有多个选项,这意味着每个listbox中可以分别选择几个项目。

我需要为此制作方法或方法:

如果您选择一个listbox中的项目,则必须在另一个项目中自动选择相同索引的项目,反之亦然。

我知道如何只用一个选择来管理它。

请帮忙!

3 个答案:

答案 0 :(得分:0)

我不知道您的具体情况,但您可以使用此解决方法在ListBoxes

中选择相同的索引
private void button1_Click(object sender, System.EventArgs e)
{
    int index;//Your Index select in any listbox
    listBox1.SetSelected(index,true);
    listBox2.SetSelected(index,true);
}

答案 1 :(得分:0)

假设您有n个列表框:

List<ListBox> MyList=new List<ListBox>();

  int index;

Mylist.add(ListBox1);
MyList.add(ListBox2);
....

private void ApplyIndex(int index)
{
   foreach(ListBox li in MyList)
     {
         li.SelectedIndex=index;      
      }
}

对于每个ListBox,我添加一个selection_change事件来获取索引:

  private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
           int x= listBox1.SelectedIndex;
            ApplyIndex(x);
         }

private void listBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
           int x= listBox2.SelectedIndex;
            ApplyIndex(x);
         }

......

答案 2 :(得分:0)

如果是Winforms,这里有一个应该做的小课(未经测试)。

class SelectionIndexDifference {

    List<int> previousIndices = new List<int>();

    public event Action<int, bool> SelectionChanged;

    public void SetSelectionChange(SelectedIndexCollection selectedIndices) {
        var newIndices = new List<int> ();
        for (int i = 0; i < selectedIndices.Count; i++) {
            newIndices.Add ((int)selectedIndices [i]);
        }

        var addedIndices = new SortedSet<int> (newIndices);
        addedIndices.ExceptWith (previousIndices);
        var removedIndices = new SortedSet<int> (previousIndices);
        removedIndices.ExceptWith (newIndices);

        foreach (var index in addedIndices) {
            SelectionChanged (index, true);
        }
        foreach (var index in removedIndices) {
            SelectionChanged (index, false);
        }
        previousIndices = newIndices;
    }
}

在表单中,您可以创建此类的实例作为字段(称为selectDiff),并在构造函数中(在初始化组件之后),您可以注册事件。

partial class FormX {
    SelectionIndexDifference selectDiff = new SelectionIndexDifference ();

    public FormX() {
        InitializeComponent ();

        listBox1.SelectedIndexChanged += (sender, e) => {
            selectDiff.SetSelectionChange (listBox1.SelectedItems);
        };
        listBox2.SelectedIndexChanged += (sender, e) => {
            selectDiff.SetSelectionChange (listbox2.SelectedItems);
        };

        selectDiff.SelectionChanged += listBox1.SetSelected;
        selectDiff.SelectionChanged += listBox2.SetSelected;
    }
}

编辑:

您可以通过删除更新列表框的需要来提高效率,通过多个SelectIndexDifference实例(每个列表框一个)来更新选择从用户输入更改的列表框,您不订阅各个列表框到SelectionChanged,例如,如果我们保持3个列表框同步:

listBox1.SelectedIndexChanged += (sender, e) => {
    selectDiff1.SetSelectionChange (listBox1.SelectedItems);
};
selectDiff1.SelectionChanged += listBox2.SetSelected;
selectDiff1.SelectionChanged += listBox3.SetSelected;


listBox2.SelectedIndexChanged += (sender, e) => {
    selectDiff2.SetSelectionChange (listbox2.SelectedItems);
};
selectDiff2.SelectionChanged += listBox1.SetSelected;
selectDiff2.SelectionChanged += listBox3.SetSelected;


listBox3.SelectedIndexChanged += (sender, e) => {
    selectDiff3.SetSelectionChange (listBox1.SelectedItems);
};
selectDiff3.SelectionChanged += listBox1.SetSelected;
selectDiff3.SelectionChanged += listBox2.SetSelected;

然而,这将占用内存的N倍,因为为每个实例存储了“previousIndices”,尽管它们应该总是具有相同的索引。可以对其进行改进以将其存储一次,并且仍然具有类似事件的多个实例。我会把它作为锻炼给你。