2012-05-09 2 views
1

У меня есть класс, который используется для добавления значений в Combobox (один используется для отображения и других, как скрытые)Как ограничить Combobox для добавления повторяющихся значений?

public class ComboBoxItem 
    { 
     string displayValue; 
     string hiddenValue; 

    //Constructor 
    public ComboBoxItem(string displayVal, string hiddenVal) 
    { 
     displayValue = displayVal; 
     hiddenValue = hiddenVal; 
    } 

    //Accessor 
    public string HiddenValue 
    { 
     get 
     { 
      return hiddenValue; 
     }    
    } 
    //Override ToString method 
    public override string ToString() 
    { 
     return displayValue; 
    } 

Используя этот класс я добавить значения в COMBOBOX

cmbServerNo.Items.Add(new ComboBoxItem(strIPAddress, iConnectionID.ToString())); 

Но я хочу ограничить повторяющиеся значения я использую ниже подход

foreach (KeyValuePair<int, Object> ikey in m_lstConnectionID) 
      { 
       if (!cmbServerNo.Items.Contains(strIPAddress)) 
       { 
        cmbServerNo.Items.Add(new ComboBoxItem(strIPAddress, iConnectionID.ToString())); 
       } 
      } 

Но Угадайте она добавляет как strIpAddress и ConnectionID так, когда я проверить его содержит это не удается. Как решить эту проблему? Благодаря

+0

Есть причина, почему вы сохранили повторяющиеся записи в первую очередь? –

ответ

0

Если вы хотите использовать функцию Items.Contains из ListBox или ComboBox, объект должен реализовать интерфейс IEquatable.

Что-то вроде этого:

public class ComboBoxItem : IEquatable<ComboBoxItem> { 
    // class stuff 

    public bool Equals(ComboBoxItem other) { 
    return (this.ToString() == other.ToString()); 
    } 

    public override bool Equals(object obj) { 
    if (obj == null) 
     return base.Equals(obj); 

    if (obj is ComboBoxItem) 
     return this.Equals((ComboBoxItem)obj); 
    else 
     return false; 
    } 

    public override int GetHashCode() { 
    return this.ToString().GetHashCode(); 
    } 
} 

Теперь Items.Contains должен работать так:

// this should be added: 
ComboBoxItem addItem = new ComboBoxItem("test", "test item"); 
if (!cb.Items.Contains(addItem)) { 
    cb.Items.Add(addItem); 
} 

// this should not be added: 
ComboBoxItem testItem = new ComboBoxItem("test", "duplicate item"); 
if (!cb.Items.Contains(testItem)) { 
    cb.Items.Add(testItem); 
} 
1

Вы можете использовать метод Any расширения LINQ в:

if (!cmbServerNo.Items.Any(x => x.ToString() == strIPAddress)) 
{ 
    cmbServerNo.Items.Add(new ComboBoxItem(strIPAddress, 
              iConnectionID.ToString())); 
} 
+0

Я использую .Net 2.0 – user662285

0

Вы можете использовать HashSet (MSDN)

HashSet<String> items = new HashSet<String>(); 
foreach (KeyValuePair<int, Object> ikey in m_lstConnectionID) 
      { 
       if (!items.Contains(strIPAddress)) 
       { 
        items.Add(strIPAddress); 
        cmbServerNo.Items.Add(new ComboBoxItem(strIPAddress, iConnectionID.ToString())); 
       } 
      } 
+0

Я использую .Net 2.0 – user662285

+0

@ user662285: Вы можете использовать не-общий ['Hashtable'] (http://msdn.microsoft.com/en-us/library/system.collections .hashtable.aspx) в этом случае. –