说来,很多的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" ) );//新加的代码
}