在我的項目中,我有大約100個組合框,每個組合框都包含相同的項目。我想要像這樣「更新」每個組合框:更新多個組合框
當在組合框A中選擇某個項目時,所有其他組合框都不應該包含此項目。同樣,當組合框A中的選定項目再次發生變化時,以前的項目應該再次出現在其他組合框中,等等,我希望這發生在每個單獨的組合框中。
完成此操作的最佳方法是什麼?如果可能,使用更少的代碼和計時器。
在我的項目中,我有大約100個組合框,每個組合框都包含相同的項目。我想要像這樣「更新」每個組合框:更新多個組合框
當在組合框A中選擇某個項目時,所有其他組合框都不應該包含此項目。同樣,當組合框A中的選定項目再次發生變化時,以前的項目應該再次出現在其他組合框中,等等,我希望這發生在每個單獨的組合框中。
完成此操作的最佳方法是什麼?如果可能,使用更少的代碼和計時器。
我會試試ComboBox上的DataBinding,所以我不必去控制ComboBoxs本身。
您可以通過直接控制源來控制組合框數據。
所以只能在DataSource中顯示一個未標記的DataEntry,或類似的東西。
樣品的數據綁定:
http://msdn.microsoft.com/en-us/library/x8ybe6s2%28v=vs.80%29.aspx
一種方法....
我想你需要三個列表:AvailableItems,SelectedItems和組合框。
當一個項目被選中時,你將它從AvailableItems中取出並放入SelectedItems中。然後迭代ComboBox並將每個重新綁定到AvailableItems。
棘手的部分是每個組合框保持它的選定項目。重新綁定之前,保存所選項目,重新綁定,將選定項目放回並重新選擇它。
您可能需要在發生所有這些情況時執行Suspendlayout(),以避免屏幕更新。
使用幫助程序類來處理更改並跟蹤當前選定的項目。事情是這樣的:
public class ComboboxSwitcher
{
List<ComboBox> boxlist = new List<ComboBox>();
Dictionary<ComboBox, object> olditems = new Dictionary<ComboBox, object>();
public void Add(params ComboBox[] boxes)
{
boxlist.AddRange(boxes);
boxes.ToList().ForEach(box => box.SelectedIndexChanged += handler);
}
private void handler(object sender, EventArgs e)
{
ComboBox trigger = (ComboBox) sender;
object item = trigger.SelectedItem;
object olditem = null;
if (olditems.ContainsKey(trigger)) olditem = olditems[trigger];
boxlist.ForEach(box =>
{
if (box != trigger)
{
if (olditem != null) box.Items.Add(olditem);
box.Items.Remove(item);
}
});
olditems[trigger] = item;
}
}
通過添加的所有組合框中添加方法是這樣的:
List<string> items = new List<string> { "A", "B", "C", "D" };
comboBox1.Items.AddRange(items.ToArray());
comboBox2.Items.AddRange(items.ToArray());
comboBox3.Items.AddRange(items.ToArray());
new ComboboxSwitcher().Add(comboBox1, comboBox2, comboBox3);
類註冊了一個的SelectedIndexChanged處理所有組合框被告知的變化。
如果選擇更改,它將檢查此combox是否有先前選定的值(使用內部字典結構)。然後迭代所有組合框並更改項目,即。刪除新選中的一個,並將舊的添加到除變更框外的所有框中。最後它更新ints內部字典。
您並不需要跟蹤其他組合框中的當前選擇,因爲選擇不會改變。
而且你可以通過使用這個類的多個實例來構建獨特的組合框。
你是否有動態創建的所有組合框,因此已經存在於列表/集合中,或者你如何想象在表單中找到它們? –
所有的都是在設計時創建的,每個組合框現在可以保存與組合框一樣多的項目。從其他組合框中刪除選定的項目不是最大的問題,我只是無法弄清楚當comboBox再次更改其選定的項目時如何讀取它們。 – makulu