删除其他列表框已选择的列表框条目

时间:2016-10-11 12:57:30

标签: c# winforms observablecollection

我有一个简单的表单,可以扫描我的网络并查找计算机。我为找到的每台计算机动态添加用户控件。在每个用户控件中都有一个我需要管理的下拉列表。这是UI的屏幕截图: enter image description here

每个列表框可能包含2个可能列表中的1个。为简单起见,假设左列列表框绑定到laptops.xml数据源,而右列列表框绑定到servers.xml。

让我们说laptops.xml包含以下条目:

  1. 戴尔Inspiron
  2. 华硕
  3. Mac Air
  4. 和servers.xml包含以下条目:

    1. Dell Poweredge
    2. HP磁带备份
    3. Dell Precision
    4. 的Linux
    5. 所以我需要UI做的是每当用户从列表中选择一个项目时,该项目应该从其他列表中删除,这样它就不能被选中两次。请注意,它应该只修改与同一列表绑定的其他列表...换句话说,如果我选择“Mac Air'从第一个下拉列表开始,程序应该只修改另外两个列表而不是任何与server.xml绑定的列表框。

      要确定哪个列表框绑定到哪个xml文件,我会在动态创建用户控件并将其添加到表单时使用列表框的.Tag属性。

      我认为我可以使用ObservableCollection来做到这一点但不确定如何实现它并让它做我需要的。

1 个答案:

答案 0 :(得分: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 );
}

(这段代码不是万无一失的,只是为了给你一个想法)