說來,很多的dropdownlist選項都不是固定的,是會動態改變的,一種方法是在頁面上寫死,改變時,直接修改頁面就可以了。但是很多人是使用動態綁定的,因此dropdownlist的Text和Value是需要動態生成的。
首先我們來創建一個表來存放DropDownList的菜單選項:
create table DDLItem --下拉菜單選項表
(
id int Identity Primary Key, --編號
ItemName varchar(20) --菜單名稱
)
再在web.config裏添加:
<appSettings>
<add key="ConnectionString" value="server=127.0.0.1;uid=sa;password=1234;database=smsc" />
appSettings>
一個最常用的方法就是用DataSet作爲數據源來綁定Dropdownlist的值。
首先我們先在頁面上加上一個DropDownList和一個Button,如圖所示:
源代碼如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Configuration;
namespace BindDropDownList
{
///
/// Example1 的摘要說明。
///
public class Example1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList DropDownList1;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
///
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
//取得Web.config裏的數據庫連接字串
string ConnString = ConfigurationSettings.AppSettings["ConnectionString"];
//創建一個SqlConnection
SqlConnection Conn = new SqlConnection( ConnString );
string SQL_Select = "select id, ItemName from DDLItem order by id desc";
//構造一個SqlDataAdapter
SqlDataAdapter myAdapter = new SqlDataAdapter( SQL_Select, Conn);
//開始讀取數據
Conn.Open();
DataSet dataSet = new DataSet();
myAdapter.Fill( dataSet,"Table1" );
Conn.Close();
//開始綁定DropDownList
//指定DropDownList使用的數據源
DropDownList1.DataSource = dataSet.Tables["Table1"].DefaultView;
//指定DropDownList使用的表裏的那些字段
DropDownList1.DataTextField = "ItemName"; //dropdownlist的Text的字段
DropDownList1.DataValueField = "id";//dropdownlist的Value的字段
DropDownList1.DataBind();
}
}
}
效果圖如下:
未綁定的
綁定後的
這個方法比較簡單實用,可以靈活的指定一個表裏的任意字段爲DropDownList的Text和Value值。但是DataSet包含的其他屬性太多,就是相當於一個脫機的數據庫。因此說來,不是很贊成使用這個方法綁定DropDownList。
在我的《也談談動態綁定dropdownlist(1)》的文章裏,(http://blog.csdn.net/zsxfbj/archive/2004/07/08/36659.aspx)提到了的是利用dataset作爲數據源來實現dataset的Item綁定。但是DataSet包含的內容和結構太多,我們只要求的是快速的綁定DropDownList的Item,而不對數據做任何的操作。所以說用DataSet做數據源的話,是不是有些大材小用的感覺?
而且在用DataSet做爲數據源的時候,我們要指定:
DropDownList1.DataTextField = "ItemName"; //dropdownlist的Text的字段
DropDownList1.DataValueField = "id";//dropdownlist的Value的字段
這樣的話,我們還要知道表的字段,這個方面不是很好。如果我們想在綁定一個叫Text爲:All Item,Value爲0的Item,用DataSet作爲數據源時綁定會出現問題,我在綁定DropDownList1時,先指定上面我要加的Item項:
DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//這裏爲新加代碼
DropDownList1.DataSource = dataSet.Tables["Table1"].DefaultView;
//指定DropDownList使用的表裏的那些字段
DropDownList1.DataTextField = "ItemName"; //dropdownlist的Text的字段
DropDownList1.DataValueField = "id";//dropdownlist的Value的字段
DropDownList1.DataBind();
編譯後生成的頁面的代碼:
<select name=”DropDownList1” id=”DropDownList1”>
<option value=”5”>Item5</option>
<option value=”4”>Item4</option>
<option value=”3”>Item3</option>
<option value=”2”>Item2</option>
<option value=”1”>Item1</option>
</select>
新加的All Item這項根本沒有。如果發在後面呢?
//指定DropDownList使用的數據源
//DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//新加的代碼
DropDownList1.DataSource = dataSet.Tables["Table1"].DefaultView;
//指定DropDownList使用的表裏的那些字段
DropDownList1.DataTextField = "ItemName"; //dropdownlist的Text的字段
DropDownList1.DataValueField = "id";//dropdownlist的Value的字段
DropDownList1.DataBind();
DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//新加的代碼
編譯後的頁面的代碼爲:
<select name="DropDownList1" id="DropDownList1">
<option value="5">Item5</option>
<option value="4">Item4</option>
<option value="3">Item3</option>
<option value="2">Item2</option>
<option value="1">Item1</option>
<option value="0">ALL Item</option>
</select>
好像<option value="0">ALL Item</option>這項有了,但是是放在了最下面,這又不符合我們的一般的習慣。那麼怎麼辦呢?
既然,DropDownList1.Items可以Add一個new ListItem,而且DataSet做數據源太浪費,我們又不對數據做任何修改,那麼我們只是Read一下就可以了。下面就看看這段代碼:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Configuration;
namespace BindDropDownList
{
/// <summary>
/// Example2 的摘要說明。
/// </summary>
public class Example2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList DropDownList1;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
//取得Web.config裏的數據庫連接字串
string ConnString = ConfigurationSettings.AppSettings["ConnectionString"];
//創建一個SqlConnection
SqlConnection Conn = new SqlConnection( ConnString );
string SQL_Select = "select id, ItemName from DDLItem order by id desc";
//創建一個SqlCommand
SqlCommand myCommand = new SqlCommand( SQL_Select, Conn );
//讀取數據記錄並綁定
myCommand.Connection.Open();
//使用DataReader讀取速度更快
SqlDataReader myReader = myCommand.ExecuteReader();
while ( myReader.Read() )
{
DropDownList1.Items.Add( new ListItem( myReader["ItemName"].ToString(),myReader["id"].ToString() ) );//增加Item
//或者這樣也能綁定,
//DropDownList1.Items.Add( new ListItem( myReader[1].ToString(),myReader[0].ToString() ) );//增加Item
//都是要在知道Sql語句或者數據表結構的前提下才能這樣綁定
}
myCommand.Connection.Close();
}
}
}
編譯運行後,效果一樣,但是更節省了系統的開銷。而且我們也可以方面的添加特別的Item,比如這樣:
private void Button1_Click(object sender, System.EventArgs e)
{
DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//新加一個Item
//取得Web.config裏的數據庫連接字串
string ConnString = ConfigurationSettings.AppSettings["ConnectionString"];
//創建一個SqlConnection
SqlConnection Conn = new SqlConnection( ConnString );
string SQL_Select = "select id, ItemName from DDLItem order by id desc";
//創建一個SqlCommand
SqlCommand myCommand = new SqlCommand( SQL_Select, Conn );
//讀取數據記錄並綁定
myCommand.Connection.Open();
//使用DataReader讀取速度更快
SqlDataReader myReader = myCommand.ExecuteReader();
while ( myReader.Read() )
{
DropDownList1.Items.Add( new ListItem( myReader["ItemName"].ToString(),myReader["id"].ToString() ) );//增加Item
//或者這樣也能綁定,
//DropDownList1.Items.Add( new ListItem( myReader[1].ToString(),myReader[0].ToString() ) );//增加Item
//都是要在知道Sql語句或者數據表結構的前提下才能這樣綁定
}
myCommand.Connection.Close();
}
編譯後的頁面代碼爲:
<select name="DropDownList1" id="DropDownList1">
<option value="0">ALL Item</option>
<option value="5">Item5</option>
<option value="4">Item4</option>
<option value="3">Item3</option>
<option value="2">Item2</option>
<option value="1">Item1</option>
</select>
我們目的就可以靈活的達到了。
所以說使用SqlDataReader加Add ListItem可以更快的綁定DropDownList。但是DataSet也可以想這樣的綁定DropDownList:
private void Button1_Click(object sender, System.EventArgs e)
{
//取得Web.config裏的數據庫連接字串
string ConnString = ConfigurationSettings.AppSettings["ConnectionString"];
//創建一個SqlConnection
SqlConnection Conn = new SqlConnection( ConnString );
string SQL_Select = "select id, ItemName from DDLItem order by id desc";
//構造一個SqlDataAdapter
SqlDataAdapter myAdapter = new SqlDataAdapter( SQL_Select, Conn);
//開始讀取數據
Conn.Open();
DataSet dataSet = new DataSet();
myAdapter.Fill( dataSet,"Table1" );
Conn.Close();
//開始綁定DropDownList
DataTable dataTable = dataSet.Tables["Table1"];
foreach( DataRow dataRow in dataTable.Rows )
{
DropDownList1.Items.Add( new ListItem( dataRow[1].ToString(), dataRow[0].ToString() ) );
}
// //指定DropDownList使用的數據源
// //DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//新加的代碼
// DropDownList1.DataSource = dataSet.Tables["Table1"].DefaultView;
// //指定DropDownList使用的表裏的那些字段
// DropDownList1.DataTextField = "ItemName"; //dropdownlist的Text的字段
// DropDownList1.DataValueField = "id";//dropdownlist的Value的字段
// DropDownList1.DataBind();
// DropDownList1.Items.Add( new ListItem( "ALL Item", "0" ) );//新加的代碼
}
當然,怎麼綁定DropDownList都是個人喜好的問題了,這個都是屬於編程技巧的範圍了。呵呵,希望大家能一起交流編程的技巧和經驗。