将 ASP.NET DropDownList 绑定到数组、字典和枚举
在 .NET 中将 DropDownList 数据绑定到数组(一维/二维)、枚举和字典对象
数据绑定是将应用程序 UI 与业务逻辑建立连接的过程。本文描述了将 DropDownList (使用 C# 代码隐藏文件)
动态数据绑定到 .NET Framework 中可用的各种数据结构,即:一维和二维 Array
、Enum
和 Dictionary
对象。
数据绑定可以通过两种替代方式完成:使用迭代技术,即循环遍历数据结构对象并将项目添加到 DropDownList
,或者使用 DropDownList
的 DataSource/DataBind()
属性/方法。以下代码片段使用 C#/ASP.NET 实现了这两种技术,适用于上述数据结构(为演示目的,封装在 Default.aspx 文件中,以及相应的代码隐藏文件 Default.aspx.cs 文件中)。
列表 1. Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Binding DropDownList | ASP.NET</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddl2DictionaryDataBind" runat="server" />
<asp:DropDownList ID="ddl2DictionaryBindValues" runat="server" />
<asp:DropDownList ID="ddl2DictionaryLoop" runat="server" />
<asp:DropDownList ID="ddl2EnumBindValues" runat="server" />
<asp:DropDownList ID="ddl2EnumLoop" runat="server" />
<asp:DropDownList ID="ddl2Array" runat="server" />
<asp:DropDownList ID="ddl2Array2d" runat="server" />
</div>
</form>
</body>
</html>
列表 2. Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using System.Data;
using System.Linq; // this is only needed for Method 1b
public partial class _Default : System.Web.UI.Page
{
// sample 1d array containing string items: countries in North America
string[] arrCountries = { "United States of America", "Canada", "Mexico" };
// sample 2d array containing string items: countries in North America and corresponding Country codes (ISO 3166)
string[,] arrCountries2d = { {"United States of America", "US"}, {"Canada", "CA"}, {"Mexico", "MX"} };
// sample enum containing Country codes in North America
// with numeric representation (ISO 3166)
enum enumCountries { US=840, CA=124, MX=484 };
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
// create sample dictionary object: country list in North America
Dictionary<string,> dictCountries = new Dictionary<string,>();
dictCountries.Add("US", "United States of America");
dictCountries.Add("CA", "Canada");
dictCountries.Add("MX", "Mexico");
// Method 1a: Data Binding DropDownList to Dictionary using DataSource and DataBind()
ddl2DictionaryDataBind.DataSource = dictCountries;
ddl2DictionaryDataBind.DataTextField = "Value";
ddl2DictionaryDataBind.DataValueField = "Key";
ddl2DictionaryDataBind.DataBind();
ddl2DictionaryDataBind.ToolTip = "Data Bind to Dictionary using Value/Key";
// Method 1b. Data Binding DropDownList to Dictionary (either Keys or Values)
// using DataSource property of the DropDownList object. This method will
// render the <select> HTML element with option values and inner HTML
// both corresponding to Dictionary Values (it could be bound to Keys instead)
// note: this method requires System.Linq reference
ddl2DictionaryBindValues.DataSource = dictCountries.Values.ToArray();
ddl2DictionaryBindValues.DataBind();
ddl2DictionaryBindValues.ToolTip = "Data Bind to Dictionary using only Values";
// Method 1c. Data Binding DropDownList to Dictionary using iterations:
// looping through the dictionary items and adding them to the DropDownList
// this method will render the <select> HTML element with option values
// corresponding to Dictionary Keys and inner HTML corresponding to Values
// note: if Dictionary contains data types other than String (for example, Dictionary<int,>)
// then add the ToString() conversion to that data type
ddl2DictionaryLoop.ToolTip = "Bind to Dictionary (Key/Values) using iteration";
foreach (KeyValuePair<string,> _dictItem in dictCountries)
{
ddl2DictionaryLoop.Items.Add(new ListItem(_dictItem.Value, _dictItem.Key));
}
// Method 2a. Data Binding DropDownList to Enum using DataSource/DataBind()
ddl2EnumBindValues.ToolTip = "Data Bind to Enum, Values only";
ddl2EnumBindValues.DataSource = Enum.GetNames(typeof(enumCountries));
ddl2EnumBindValues.DataBind();
// Method 2b. Data Binding DropDownList to Enum, alternative method using iteration
ddl2EnumLoop.ToolTip = "Bind to Enum (Key/Values) using iteration";
foreach (enumCountries co in Enum.GetValues(typeof(enumCountries)))
{
string _val = co.ToString();
string _key = ((Int32)Enum.Parse(typeof(enumCountries), _val)).ToString();
ddl2EnumLoop.Items.Add(new ListItem(_val, _key));
}
// Method 3a. Data Binding DropDownList to 1D-array of strings (countries in North America)
ddl2Array.ToolTip = "Data Bind to 1d array";
ddl2Array.DataSource = arrCountries;
ddl2Array.DataBind();
// Method 3b. Data Binding DropDownList to 2D-array of strings (countries in North America)
ddl2Array2d.ToolTip = "Bind to 2d array";
for (int i = 0; i < arrCountries2d.GetLength(0); i++)
{
ddl2Array2d.Items.Add(new ListItem(arrCountries2d[i, 0], arrCountries2d[i, 1]));
}
}
}
}
// ************************************************************************************************
将 DropDown List 绑定到枚举
以下代码片段演示了将 ASP.NET DropDownList 控件绑定到枚举的编码技术
列表 3:将 ASP.NET DropDownList 控件绑定到枚举
// Data Binding DropDownList to Enum using DataSource/DataBind()
ddl2EnumBindValues.ToolTip = "Data Bind to Enum, Values only";
ddl2EnumBindValues.DataSource = Enum.GetNames(typeof(enumCountries));
ddl2EnumBindValues.DataBind();
// Data Binding DropDownList to Enum, alternative method using iteration
ddl2EnumLoop.ToolTip = "Bind to Enum (Key/Values) using iteration";
foreach (enumCountries co in Enum.GetValues(typeof(enumCountries)))
{
string _val = co.ToString();
string _key = ((Int32)Enum.Parse(typeof(enumCountries), _val)).ToString();
ddl2EnumLoop.Items.Add(new ListItem(_val, _key));
}
将 DropDown List 绑定到字典对象
以下代码片段演示了将 ASP.NET DropDownList 控件绑定到一维和二维数组的编码技术
列表 4:将 ASP.NET DropDownList 控件绑定到字典
// Data Binding DropDownList to Dictionary using DataSource and DataBind()
ddl2DictionaryDataBind.DataSource = dictCountries;
ddl2DictionaryDataBind.DataTextField = "Value";
ddl2DictionaryDataBind.DataValueField = "Key";
ddl2DictionaryDataBind.DataBind();
ddl2DictionaryDataBind.ToolTip = "Data Bind to Dictionary using Value/Key";
// Data Binding DropDownList to Dictionary (either Keys or Values)
// using DataSource property of the DropDownList object. This method will
// render the <select> HTML element with option values and inner HTML
// both corresponding to Dictionary Values (it could be bound to Keys instead)
// note: this method requires System.Linq reference
ddl2DictionaryBindValues.DataSource = dictCountries.Values.ToArray();
ddl2DictionaryBindValues.DataBind();
ddl2DictionaryBindValues.ToolTip = "Data Bind to Dictionary using only Values";
// Data Binding DropDownList to Dictionary using iterations:
// looping through the dictionary items and adding them to the DropDownList
// this method will render the <select> HTML element with option values
// corresponding to Dictionary Keys and inner HTML corresponding to Values
// note: if Dictionary contains data types other than String (for example, Dictionary<int,>)
// then add the ToString() conversion to that data type
ddl2DictionaryLoop.ToolTip = "Bind to Dictionary (Key/Values) using iteration";
foreach (KeyValuePair<string,> _dictItem in dictCountries)
{
ddl2DictionaryLoop.Items.Add(new ListItem(_dictItem.Value, _dictItem.Key));
}
将 DropDown List 绑定到数组
以下代码片段演示了将 ASP.NET DropDownList 控件绑定到一维和二维数组的编码技术
列表 5:将 ASP.NET DropDownList 控件绑定到一维和二维数组
// Data Binding DropDownList to 1D-array of strings (countries in North America)
ddl2Array.ToolTip = "Data Bind to 1d array";
ddl2Array.DataSource = arrCountries;
ddl2Array.DataBind();
// Data Binding DropDownList to 2D-array of strings (countries in North America)
ddl2Array2d.ToolTip = "Bind to 2d array";
for (int i = 0; i < arrCountries2d.GetLength(0); i++)
{
ddl2Array2d.Items.Add(new ListItem(arrCountries2d[i, 0], arrCountries2d[i, 1]));
}
关注点
除了数据绑定之外,[1] 还详细介绍了通过 CSS3 将 DropDownList 控件渲染为 HTML5 Select 元素时的样式设置。
参考文献