【问题标题】:Item of one combobox should not come into the other一个组合框的项目不应进入另一个
【发布时间】:2010-04-27 21:36:53
【问题描述】:

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

【问题讨论】:

标签: c#


【解决方案1】:

您应该删除这个问题或this one,它们是关于相同的事情。无论如何,这是我相同的答案:

在A的选中项更改事件中,添加清除B的代码,然后循环A的Item集合中的每个项目并将其添加到B只要当前项目的索引与中的SelectedItem的索引不同A.

类似的东西(伪代码,未经测试)

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);

也应该这样做。

【讨论】:

    【解决方案2】:

    我会结合使用静态扩展方法和 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!

    注意:可能有比返回列表项数组更有效的方法,但就全局而言(例如整体性能等),我认为这不是一个大问题.....

    【讨论】:

    • 如果您有两个具有相同名称的项目,则将使用您的解决方案删除这两个项目。
    【解决方案3】:

    我认为您必须在 A 的更改事件中对 B 的填充/删除进行编码

    【讨论】:

      【解决方案4】:
      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());
      

      【讨论】:

      • 应该指出的是,如果组合A有任何重复项,这将删除超过1个条目....
      • 是的,当然,但描述没有说明这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多