【原创】Winform下拉框自动选择实现

适用环境:Winform开发,VS2008开发工具

问题描述:

  1. 有一系列产品,每个产品都有唯一产品ID,产品名称。
  2. 需要绑定产品到下拉框(ComboBox)中,由于Winform的下拉框控件,不像Web开发中的下拉框控件一样,能够直接添加两个元素到每一项(Value和Text)。但是它允许直接添加object对象项,所以反而更灵活。
  3. 在下拉框中需要显示产品信息,并且不只是简单显示名称,需要做一些特别的处理,因此没法使用。

cboxProduct.DisplayMember = "ProductName";

    cboxProduct.ValueMember = "ProductId";

cboxProduct.DataSource = dataTable;                //Product Data Source

  4.  要能够根据产品信息,自动选择到特定产品。

解决思路:

  1. 首先我们可以定义一个产品信息类,包含产品的各种信息。在这里我们必须要的信息可以作为构造函数的参数,使得实例化产品类必须设置这些信息。同时对于绑定下拉框信息话,我们还可以提取一个公有的类,专门用于绑定下拉框时使用,因为大多数情况下,我们一般使用下拉框只需要绑定两类信息。但是信息的数据格式却是不定的,所以可以考虑泛型。
  2. 采用泛型创建公有下拉框数据类,包含两个属性:Value和Text。
  3. 由于Value属性作为我们下拉框索引值,必须是唯一的,所以在判断下拉框数据项是否相同时,可以通过判断是否Value是否相同来确定(必须说明的是在这里我们并没有强制判断Value值是否唯一,你可以在绑定数据时判断),判断两个对象是否相等的方法,可以想到考虑重写Equal方法来实现。

下面我们来看一个实际的例子实现吧!

实例代码:

  1. 创建一个产品类型类(ProductType类),由于产品类型可以是一个无限级分类(某一产品类型下的子产品类型层次不定,可能会很多层子类型),在下拉框显示产品类型时,需要区分父子产品类型。产品类型类具体代码如下:

class ProductType<T, TK>

    {

        public ProductType(T value, TK text)

        {

            _value = value;

            _text = text;

        }

 

        private T _value;

        /// <summary>

        /// 值

        /// </summary>

        public T Value

        {

            get { return _value; }

            set { _value = value; }

        }

 

        private TK _text;

        /// <summary>

        /// 显示值

        /// </summary>

        public TK Text

        {

            get { return _text; }

            set { _text = value; }

        }

 

        public override string ToString()

        {

            return _text.ToString();

        }

 

        public override bool Equals(object obj)

        {

            return ((ProductType<T, TK>)obj).Value.Equals(_value);

        }

    }

  1. 新建一个测试窗体,并添加一个下拉框控件(ComboBox),命名为cboxProductType。绑定产品类型数据到下拉框。循环绑定产品类型,并递归遍历其子产品类型。实现代码如下:

private void BindingProductType(int parentProductTypeId, string splitStr)

        {

            var dataSource = bllProductType.GetList(" parentId=" + parentProductTypeId).Tables[0];

            foreach (DataRow dataRow in dataSource.Rows)

            {

                var productTypeId = Convert.ToInt32(dataRow["productTypeId"]);

                cboxProductType.Items.Add(new ProductType()<int, string>(productTypeId,

                                                                   splitStr + dataRow["productTypeName"]));

                BindingProductType(productTypeId, splitStr + @"--|");

            }

        }

  1. 提供了某一个产品类型的ID后,我们使下拉框自动选择到该ID的产品类型,可以使用cboxProductType.SelectedItem属性进行设置。具体方法参看代码:

ProductType<int, string> productType = new ProductType(productTypeId, "");

    cboxProductType.SelectedItem = productType;

由于产品类型ID是唯一值,我们在产品类型类中比较时也只与Value值相关,因此在实例化ProductType类时,无须提供Text属性值,因为Text属性值对于我们判断产品类型是否相等无关。(这种情况主要使用在编辑数据时,根据已有数据进行填充和选择。)

原文地址:https://www.cnblogs.com/zwffff/p/1810221.html