2016-10-11 4 views
0

У меня есть простая форма, которая сканирует мою сеть и находит компьютеры. Я динамически добавляю пользовательский элемент управления для каждого найденного компьютера. Внутри каждого пользовательского элемента управления находится раскрывающийся список, который мне нужно управлять. Вот скриншот UI: enter image description hereУдалить записи списков, которые выбрали другие списки

Каждый список может содержать 1 из 2 возможных списков. Для простоты, скажем, левые столбцы списка привязаны к источнику данных laptops.xml, в то время как списки справа столбца привязаны к server.xml.

Позволяет сказать laptops.xml содержит следующие данные:

  1. Dell Inspiron
  2. Asus
  3. Mac Air

и servers.xml содержат эти записи:

  1. Dell PowerEdge
  2. HP резервного копирования на ленту
  3. Dell Precision
  4. Linux

Так что мне нужно интерфейс, чтобы сделать это каждый раз, когда пользователь выбирает элемент из списка, этот элемент должен быть удален из другие списки, чтобы он не мог быть выбран дважды. Обратите внимание, что он должен изменять только другие списки, привязанные к одному списку ... другими словами, если я выбираю «Mac Air» из первого раскрывающегося списка, программа должна изменять только два других списка, а не список из списка привязан к server.xml.

Чтобы определить, какой список связан с файлом xml, я использую свойство .Tag списка, когда пользовательский элемент управления динамически создается и добавляется в форму.

Я бы подумал, что могу использовать ObservableCollection для этого, но не уверен, как его реализовать и заставить его делать то, что мне нужно.

+0

@ S.Akbari - I» m пытается управлять списками «выбрать», когда пользователь выбирает каждый из них. Поэтому, если пользователь выбирает «Dell» из первого списка слева. Остальные два списка должны удалить эту запись из своих списков, чтобы ее нельзя было выбрать снова. – Robert

ответ

1

Вы можете сохранить список всех выбранных компьютеров (или, возможно, 2 списка, один для серверов, один для ноутбуков) на уровне форм. Ваши панели (которые содержат comboboxes) должны подписываться на listchangeevent из этого и адаптировать элементы combobox всякий раз, когда он изменяется. И наоборот, вам нужно подписаться на событие SelectedIndexChanged для списков combobox для поддержки этого глобального списка.

В вашей форме:

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

Смежные вопросы