使用列表框或组合框调用同一函数

本文关键字:函数 调用 列表 组合 | 更新日期: 2023-09-27 18:36:59

我有一系列要更新的列表框和组合框,以便列出的项目与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 ,将其直接分配给每个特定于控件类型的if分支中的 Items 属性。

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

但是您声明要实际操作集合。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...
}