2016-10-11 196 views
0

我有一個簡單的表單,它掃描我的網絡並找到計算機。我爲每臺發現的計算機動態添加一個用戶控件。在每個用戶控件中都有一個我需要管理的下拉列表。以下是用戶界面的屏幕截圖: enter image description here刪除其他列表框選擇的列表框條目

每個列表框可能包含2個可能列表中的1個。爲了簡單起見,可以說左列列表框被綁定到laptops.xml數據源,而右列列表框被綁定到servers.xml。

比方說在laptops.xml包含以下項目:

  1. 戴爾Inspiron
  2. 華碩
  3. 的Mac空氣

和servers.xml包含這些條目:

  1. 戴爾PowerEdge
  2. HP磁帶備份
  3. 戴爾Precision
  4. Linux的

所以我需要的UI做的就是當用戶從列表中選擇一個項目,該項目應予以除名其他清單,以便它不能被選擇兩次。請注意,它應該只修改與同一個列表綁定的其他列表...換句話說,如果我從第一個下拉列表中選擇「Mac Air」,那麼程序應該只修改其他兩個列表,而不是任何列表框綁定到server.xml。

要確定哪個列表框綁定到哪個xml文件,當用戶控件是動態創建並添加到窗體時,我使用列表框的.Tag屬性。

我想我可以使用ObservableCollection來做到這一點,但不知道如何實現它,並得到它來做我所需要的。

+0

@ S.Akbari - 我當用戶選擇每個列表時,試圖管理「選擇」列表。因此,如果用戶從左側的第一個列表框中選擇「戴爾」。另外兩個列表框需要從列表中刪除該條目,以便它不能再次被選擇。 – Robert

回答

1

您可以在表單級別保存所有選定計算機的列表(或者可能是2個列表,一個用於服務器,另一個用於筆記本電腦)。您的面板(包含組合框)應該訂閱它的listchange事件,並在組合框更改時調整組合框的項目。反之亦然,您需要訂閱組合框的SelectedIndexChanged事件來維護該全局列表。

在您的形式:

ObservableCollection<string> selectedServers = new ObservableCollection<string>(); 
public void Load() 
{ 
    List<string> allServers = GetServerNames("servers.xml"); 
    foreach(ComputerPanel pnl in serverPanels) 
     pnl.LoadLists(allServers, selectedServers); 
} 

在您的面板:

public void LoadLists(List<string> allServers, ObservableCollection<string> selectedServers) 
{ 
    foreach(string server in allServers) 
     combo1.Items.Add(server); 
    selectedServers.CollectionChanged += selectedServers_CollectionChanged; 
    combo1.SelectedIndexChanged += (object sender, EventArgs e) => { selectedServers.Add((string)combo1.SelectedItem); }; 
} 

private void selectedServers_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    string newlySelectedServer = (string)e.NewItems[0]; 
    if(e.Action == NotifyCollectionChangedAction.Add 
     && (string)combo1.SelectedItem != newlySelectedServer) //only if selector was not my own combo 
     combo1.Items.Remove(newlySelectedServer); 
} 

(此代碼,並不是萬無一失的,只是給你一個想法)

+0

@Robert你試試這個嗎?它對你有用嗎? –

+0

排序.....我還在努力,但這讓我走上了正軌。非常感謝你! – Robert