2014-03-13 40 views
0

看,我有两个listboxes: listBox1, listBox2,都有多个选择意味着可以分别在每个listbox中选择几个项目。如何在两个(更多)列表框中选择相同的索引?

我需要为这种方法或水木清华:

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

我知道如何管理,只有一个选择。

请帮忙!

+1

显示为你到目前为止尝试过的... – apomene

+0

另外,winforms,wpf还是什么? –

回答

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); 
} 
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;  
     } 
} 

每列表框我添加了一个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); 
     } 

...... 
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”存储为每个实例,ALT尽管他们应该总是有相同的指数。可以改进这个功能来存储一次,并且仍然有类似事件的多个实例。我会把它作为你的练习。

+0

我明白了,但prog在selectDiff.SetSelectionChange(listBox1.SelectedIndices)上给出错误“最好的重载方法有一些无效参数” 奇怪,因为SelectedIndices是确切类型SelectedIndexCollection – user3414347

+0

什么错误?我假设因为SetSelectionChange的参数类型需要更改为“ListBox.SelectedIndexCollection”(它是ListBox的嵌套类)。你也可以使用'IList'来逃避。 –

+0

我可以向你发送截图吗?或者一个代码? – user3414347

相关问题