适用环境:Winform开发,VS2008开发工具
问题描述:
- 有一系列产品,每个产品都有唯一产品ID,产品名称。
- 需要绑定产品到下拉框(ComboBox)中,由于Winform的下拉框控件,不像Web开发中的下拉框控件一样,能够直接添加两个元素到每一项(Value和Text)。但是它允许直接添加object对象项,所以反而更灵活。
- 在下拉框中需要显示产品信息,并且不只是简单显示名称,需要做一些特别的处理,因此没法使用。
cboxProduct.DisplayMember = "ProductName";
cboxProduct.ValueMember = "ProductId";
cboxProduct.DataSource = dataTable; //Product Data Source
4. 要能够根据产品信息,自动选择到特定产品。
解决思路:
- 首先我们可以定义一个产品信息类,包含产品的各种信息。在这里我们必须要的信息可以作为构造函数的参数,使得实例化产品类必须设置这些信息。同时对于绑定下拉框信息话,我们还可以提取一个公有的类,专门用于绑定下拉框时使用,因为大多数情况下,我们一般使用下拉框只需要绑定两类信息。但是信息的数据格式却是不定的,所以可以考虑泛型。
- 采用泛型创建公有下拉框数据类,包含两个属性:Value和Text。
- 由于Value属性作为我们下拉框索引值,必须是唯一的,所以在判断下拉框数据项是否相同时,可以通过判断是否Value是否相同来确定(必须说明的是在这里我们并没有强制判断Value值是否唯一,你可以在绑定数据时判断),判断两个对象是否相等的方法,可以想到考虑重写Equal方法来实现。
下面我们来看一个实际的例子实现吧!
实例代码:
- 创建一个产品类型类(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);
}
}
- 新建一个测试窗体,并添加一个下拉框控件(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 + @"--|");
}
}
- 提供了某一个产品类型的ID后,我们使下拉框自动选择到该ID的产品类型,可以使用cboxProductType.SelectedItem属性进行设置。具体方法参看代码:
ProductType<int, string> productType = new ProductType(productTypeId, "");
cboxProductType.SelectedItem = productType;
由于产品类型ID是唯一值,我们在产品类型类中比较时也只与Value值相关,因此在实例化ProductType类时,无须提供Text属性值,因为Text属性值对于我们判断产品类型是否相等无关。(这种情况主要使用在编辑数据时,根据已有数据进行填充和选择。)