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

Calling the same function with ListBox or ComboBox

我有一系列列表框和组合框要更新,以便列出的项目与 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.

等属性

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

乐。它是一个 Windows 应用程序,NET Framework 4.5 使用 System.Windows.Forms。我想添加/删除项目、计数、获取和设置选择。此外,可能存在重复项。所以将项目转换为字符串是行不通的。

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

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

但是您声明您想要实际操作这些集合。 System.Windows.Forms.ComboBox.ItemsSystem.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 类型做同样的事情。然后在您的处理程序中,您可以创建适当的抽象类型,并使用它来操作集合:

public static void UpdateListboxWithStrings(
    ListControl listcontrol, 
    IEnumerable<string> stringlist)
{
    ListControlItems items;

    if (listcontrol is ListBox)
    {
        items = new ListBoxControlItems(((ListBox)listcontrol).Items);
    }
    else if (listcontrol is ComboBox)
    {
        items = new ComboBoxControlItems(((ComboBox)listcontrol).Items);
    }
    else
    {
        //// Wrong control type.
        //// EARLY EXIT
        return;
    }

    int itemscount = items.Count;
    /// More code here...
}