请参阅,我有两个listboxes: listBox1, listBox2,
都有多个选项,这意味着每个listbox
中可以分别选择几个项目。
我需要为此制作方法或方法:
如果您选择一个listbox
中的项目,则必须在另一个项目中自动选择相同索引的项目,反之亦然。
我知道如何只用一个选择来管理它。
请帮忙!
答案 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”,尽管它们应该总是具有相同的索引。可以对其进行改进以将其存储一次,并且仍然具有类似事件的多个实例。我会把它作为锻炼给你。