2016-10-11 22 views
0

私のネットワークをスキャンしてコンピュータを見つけるシンプルなフォームがあります。私は動的に発見された各コンピュータのユーザーコントロールを追加します。各ユーザーコントロールには、管理する必要があるドロップダウンリストがあります。 UIのスクリーンショットは次のとおりです。 enter image description here他のリストボックスが選択したリストボックスの項目を削除する

各リストボックスには2つのリストがあります。わかりやすくするために、左の列リストボックスはlaptops.xmlデータソースにバインドされ、右の列リストボックスはservers.xmlにバインドされています。

laptops.xmlには、次のエントリが含まれているとしましょう:

  1. DellのInspiron
  2. Asusの
  3. マックエア

とservers.xmlは、これらのエントリが含まれています。

  1. 、Dell Poweredgeの
  2. HPテープバックアップ
  3. のDell Precision
  4. Linuxの

だから私は実行するUIは、ユーザーがリストから項目を選択するたびに、その項目から削除する必要がある必要なものそれ以外のリストを2回選択することはできません。それは、同じリストに結び付けられている他のリストだけを変更する必要があることに注意してください...言い換えると、最初のドロップダウンから「Mac Air」を選択すると、プログラムはリストボックスserver.xmlに関連付けられます。

どのリストボックスがどのxmlファイルにバインドされているかを調べるために、ユーザーコントロールが動的に作成されてフォームに追加されたときに、リストボックスの.Tagプロパティを使用します。

ObservableCollectionを使用してこれを行うことはできますが、実装する方法がわからず、必要な処理を実行できると思うでしょう。

+0

S.Akbari @ - 私は」ユーザーがそれぞれを選択するときに「選択」リストを管理しようとしています。したがって、ユーザーが左側の最初のリストボックスから「Dell」を選択した場合。他の2つのリストボックスは、リストからそのエントリを削除して、再度選択できないようにする必要があります。 – Robert

答えて

1

フォームレベルで、選択したすべてのコンピュータのリスト(または2つのリスト、サーバー用、ラップトップ用)を保持できます。あなたのパネル(コンボボックスを含む)はそれのlistchangeeventに加入し、コンボボックスの項目を変更するたびにその項目を適合させるべきです。また、その逆もあります。グローバルリストを維持するために、コンボボックスの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

関連する問題