zoukankan      html  css  js  c++  java
  • 【原创】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属性值对于我们判断产品类型是否相等无关。(这种情况主要使用在编辑数据时,根据已有数据进行填充和选择。)

  • 相关阅读:
    oracle 查询 当前最大时间的value的值
    Visual Studio《加载此属性页时出错》的解决办法
    (转) 关于在IE6下 无法跳转问题
    LINQ TO XML 个人的一些心得1
    CSS实现单行、多行文本溢出显示省略号(…)
    html 图像映射(一个图像多个连接)
    JS页面跳转大全
    首行负缩进达到内容对齐的目的
    HTML图片死活不显示
    JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
  • 原文地址:https://www.cnblogs.com/zwffff/p/1810221.html
Copyright © 2011-2022 走看看