2010-04-27 44 views
0

即時通訊使用c#.net窗體窗體應用程序。我有一個數據庫,有一些桌子。我有兩個組合框(A & B)。我已經使用sys.columns填充了組合框A和一個表的列名。現在,當我在組合框A中選擇一個項目時,組合框B應該填充除了在組合框A中選擇的選定項目以外的相同項目。一個組合框的項目不應該進入其他

+0

問題是....? – 2010-04-27 12:00:55

+0

重複的問題:http://stackoverflow.com/questions/2720648/working-with-two-combo-boxes/2720728#2720728 – 2010-04-27 12:09:57

回答

1

你應該刪除這個問題或this one這是關於相同的事情。無論如何,這裏是我的相同答案:

在所選項目中更改了A事件的事件,添加清除B的代碼,然後環繞A的Item集合中的每個項目並將其添加到B,只要當前項目的索引是在A.從的SelectedItem的索引不同

類似的信息(僞代碼中,未測試)

b.Items.Clear; 
for(int i=0; i<A.Items.Count; i++) 
{ 
    if (i!=A.SelectedItemIndex) 
    { 
    b.Items.Add(A.Items[i]); 
    } 
} 

B.Items.Clear; 
foreach(object o in A.Items) 
{ 
    b.Items.Add(o); 
} 
b.Items.Remove(A.SelectedItem); 

應該這樣做一個脹。

0

我想你會在的

0
m_comboB.Items.AddRange((from item in m_comboA.Items.Cast<object>() 
         where item != m_comboA.SelectedItem 
         select item).ToArray()); 

Change事件的代碼填充/去除B的你也可以用這樣的方式不刪除重複項(山姆指出了這一點他評論):

m_comboB.Items.AddRange(Enumerable.Range(0, m_comboA.Items.Count) 
    .Where(index => index != m_comboA.SelectedIndex) 
    .Select(index => m_comboA.Items[index]).ToArray()); 
+0

應該指出,如果組合A有任何重複的項目,這將刪除多個條目.... – 2010-04-27 12:13:17

+0

是的,當然,但描述並沒有說任何關於這一點。 – Patrik 2010-04-27 12:15:53

1

我會使用靜態擴展方法和LINQ的組合。

靜態延伸部分是這樣的:

// static class... 
public static class ComboBoxHelper 
{ 
    public static string GetSelectedIndexText(this ComboBox target) 
    { 
     return target.Items[target.SelectedIndex].ToString(); 
    } 

    public static object[] GetNonSelectedItems(this ComboBox target) 
    { 
     string selected = GetSelectedIndexText(target); 

     try 
     { 
      object[] result = 
       target.Items.Cast<object>().Where(c => c.ToString() 
       != selected).ToArray(); 
      return result; 
     } 
     catch 
     { 
      return new object[] { }; 
     } 
    } 

    public static void ReplaceItems(this ComboBox target, object[] newRange) 
    { 
     target.Items.Clear(); 
     target.Items.AddRange(newRange); 
    } 
} 

而且LINQ:

// LINQ: 
private void ComboBoxA_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    comboBoxB.ReplaceItems(comboBoxA.GetNonSelectedItems()); 
} 

HTH!

注意:可能比返回列表項的數組更有效,但我從來沒有發現這是一個大問題(例如整體性能等)的大問題.....

+0

如果您有兩個具有相同名稱的項目,則使用您的解決方案將刪除這兩個項目。 – Patrik 2010-04-28 08:34:36

相關問題