使用ListBox或ComboBox调用相同的函数

时间:2015-01-10 21:21:59

标签: c# winforms casting

我想要更新一系列列表框和组合框,以便列出的项目与IEnumerable<string>中列出的项目相同。我确实理解数据绑定可能有所帮助,但我认为现在可能有点困难,我宁愿避免它。 我写了这样的话:

    public static void UpdateListboxWithStrings(
        ListControl listcontrol, 
        IEnumerable<string> stringlist)
    {
        Object listcontrolitems;
        if (listcontrol is ListBox)
        {
            listcontrolitems =
                ((ListBox)listcontrol).Items;
        }
        else if (listcontrol is ComboBox)
        {
            listcontrolitems =
                ((ComboBox)listcontrol).Items;
        }
        else
        {
            //// Wrong control type.
            //// EARLY EXIT
            return;
        }
        int itemscount = listcontrolitems.Count;
        /// More code here...
    }

......麻烦开始了。根据我添加/删除的内容,listcontrolitems似乎未定义,或者必须初始化,或者它没有Count等属性。

如何在没有代码重复的情况下编写与组合框或列表框一起使用的函数?

LE。它是一个使用System.Windows.Forms的Windows应用程序,.NET Framework 4.5。我想添加/删除项目,计数,获取和设置选择。此外,可能有重复。因此,将项目转换为字符串将不起作用。

1 个答案:

答案 0 :(得分:1)

除非您只需要IList类型中提供的功能,否则您无法以方便的方式执行此操作。在这种情况下,您可以跳过下面描述的包装器,只需将items局部变量声明为IList,并将其直接分配给每个控件类型特定的Items属性{{1分支。

如果您需要的只是if属性值,则可以在每个特定于类型的分支中分配一个本地Count变量(即在int语句块中)。

但是你声明你想要实际操纵集合。 ifSystem.Windows.Forms.ComboBox.Items集合是两种完全不同的,不相关的类型。因此,如果您不能使用System.Windows.Forms.ListBox.Items,那么您能够共享操作它们的代码的唯一方法就是将集合包装在一个可以理解它们的新类型中。

例如:

IList

abstract class ListControlItems { public abstract int Count { get; } public abstract int Add(object item); public abstract void RemoveAt(int index); // etc. } class ListBoxControlItems : ListControlItems { private ListBox.ObjectCollection _items; public ListBoxControlItems(ListBox.ObjectCollection items) { _items = items; } public override int Count { get { return _items.Count; } } public override int Add(object item) { return _items.Add(item); } public override void RemoveAt(int index) { _items.RemoveAt(index); } // etc. } 类型执行相同的操作。然后在您的处理程序中,您可以创建适当的抽象类型,并使用它来操作集合:

ComboBoxControlItems