CodeGo.net>使ComboBox只接受特定类型

我目前在Windows窗体应用程序中有一个ComboBox.为了指定ComboBox将包含哪些值,我将ComboBox的DataSource属性设置为某个数组,以便ComboBox包含该数组中的值.我还可以使用Items.Add()将新值添加到ComboBox.但是,我想确保ComboBox可以填充某些特定类型的对象.因此,如果我有一个名为X的类,那么我想制作它,以便仅将类型X的数组用作ComboBox的数据源.现在,ComboBox接受类型为System.Object的对象.我该如何实现?是否需要将ComboBox的属性设置为等于数据类型的名称?还是有一个事件将检查添加到我的ComboBox的对象是否为所需类型,否则将引发异常?

我正在考虑创建一个新类作为ComboBox的子类型,并重写Items属性的Add方法,以便Add检查其参数是否为所需的类型(不确定是否以及如何实现).即使我这样做,仍然有其他方法可以将新值添加到ComboBox(AddRange,CopyTo等),因此我认为应该对此问题有一个更优雅的解决方案.

解决方法:

您可以按自己的方式隐藏Items属性
自定义类型的自己的Items属性,将原始ItemsCollection作为参数

测试示例类

public class Order
{
    public Int32 ID { get; set; }
    public string Reference { get; set; }

    public Order() { }
    public Order(Int32 inID, string inReference)
    {
        this.ID = inID;
        this.Reference = (inReference == null) ? string.Empty : inReference;
    }

    //Very important 
    //Because ComboBox using .ToString method for showing Items in the list
    public override string ToString()
    {
        return this.Reference;
    }

}

在下一堂课中,我尝试将ComboBox的items集合包装为自己的类型.
添加项目必须是具体类型的地方
在这里您可以添加所需的其他方法/属性(删除)

public class ComboBoxList<TCustomType>
{
    private System.Windows.Forms.ComboBox.ObjectCollection _baseList;

    public ComboBoxList(System.Windows.Forms.ComboBox.ObjectCollection baseItems)
    {
        _baseList = baseItems;
    }

    public TCustomType this[Int32 index]
    {
        get { return (TCustomType)_baseList[index]; }
        set { _baseList[index] = value; }
    }

    public void Add(TCustomType item)
    {
        _baseList.Add(item);
    }

    public Int32 Count { get { return _baseList.Count; } }

}

这里自定义ComboBox的组合框类
补充:通用类型

public class ComboBoxCustomType<TCustomType> : System.Windows.Forms.ComboBox
{
    //Hide base.Items property by our wrapping class
    public new ComboBoxList<TCustomType> Items; 

    public ComboBoxCustomType() : base()
    {
        this.Items = new ComboBoxList<TCustomType>(base.Items);
    }

    public new TCustomType SelectedItem 
    { 
        get { return (TCustomType)base.SelectedItem; } 
    }
}

表单中使用的下一个代码

private ComboBoxCustomType<Order> _cmbCustom;

//this method used in constructor of the Form
private void ComboBoxCustomType_Initialize()
{
    _cmbCustom = new ComboBoxCustomType<Order>();
    _cmbCustom.Location = new Point(100, 20);
    _cmbCustom.Visible = true;
    _cmbCustom.DropDownStyle = ComboBoxStyle.DropDownList;
    _cmbCustom.Items.Add(new Order(0, " - nothing - "));
    _cmbCustom.Items.Add(new Order(1, "One"));
    _cmbCustom.Items.Add(new Order(2, "Three"));
    _cmbCustom.Items.Add(new Order(3, "Four"));
    _cmbCustom.SelectedIndex = 0;
    this.Controls.Add(_cmbCustom);
}
上一篇:c# 获取当前方法事件对应的控件


下一篇:加载数据从SQL到组合并保存所选的值