一个组合框的项目不应该进入另一个组合框

时间:2010-04-27 10:13:21

标签: c#

我正在使用c#.net windows表单应用程序。我有一个包含一些表格的数据库。我有两个组合框(A& B)。我使用sys.columns填充了一个包含表名列的组合框A.现在,当我在组合框A中选择一个项目时,组合框B应该填充相同的项目,但在组合框A中选择的项目除外。

4 个答案:

答案 0 :(得分:1)

您应该删除此问题或this one这些相同的内容。无论如何,这是我的相同答案:

在选定的项目中更改A的事件,添加清除B的代码,然后循环回A的项目集合中的每个项目,并将其添加到B,只要当前项目的索引与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);

也应该这样做。

答案 1 :(得分: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!

注意:可能比返回列表项数组更有效,但我没有发现这是一个大问题(例如整体性能等).....

答案 2 :(得分:0)

我认为您必须在A的变更事件中填写/删除B

答案 3 :(得分:0)

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

或者你可以使用这种不删除重复项目的方式(Sam在他的评论中指出了这一点):

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