適用環境: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屬性值對於我們判斷產品類型是否相等無關。(這種情況主要使用在編輯資料時,根據已有資料進行填充和選擇。)