DataList教程

DataList<spanstyle='font-size:14.0pt;mso-bidi-font-size:10.0pt;font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"'>控件的使用<spanlang=EN-US style='font-size:14.0pt;mso-bidi-font-size:10.0pt'>

<bstyle='mso-bidi-font-weight:normal'>使用<bstyle='mso-bidi-font-weight:normal'>DataList<bstyle='mso-bidi-font-weight:normal'>控件<bstyle='mso-bidi-font-weight:normal'><spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

本章内容:

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 1、理解事件冒泡<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 2、使用模板<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 3、在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中显示数据

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 4、在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中创建多列

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 5、捕获<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件中产生的事件

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 6、选择<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中的项

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 7、使用<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件中的DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 8、编辑<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中的项

本章介绍在ASP.NET<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>框架中功能最强大的两个控件(DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件和DataGrid<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件)之一的DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件。我们将深入探讨DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件,学习如何使用该控件显示数据以及编辑数据库数据。

一、理解事件冒泡

ASP.NET框架包含三个支持事件冒泡的标准控件:<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>RepeaterDataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>和DataGrid<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件。这些控件可以让你捕获其子控件的时间。当子控件产生一个事件时,事件就<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>冒泡传给包含该子控件的容器控件,并且容器控件就可以执行一个子程序来处理该事件。<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

二、使用模板
在前一章中我们已经介绍过<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>Repeater控件的五个模板(ItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、AlternationgItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、SeparatorTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、HeaderTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、FooterTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>),可以格式化控件的输出。在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件中除了支持Repeater<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件中的五个模板以外,还支持如下两个模板:

1
SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>:控制如何格式化被选定的项

2
EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>:控制如何格式化被编辑的项。

当选定DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中选中一个项时(即DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的SelectedIndex<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性值为当前选定项的索引值),将显示SelectedItem<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板,当在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中选择一个项来编辑(即DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的EditItemIndex<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性值为当前选定项的索引值)时,将显示EditItem<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板。

三、在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中显示数据:

可以像<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>Repeater控件那样来用DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>显示数据库表中的记录。但是,与Repeater<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件不同的是:DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的默认行为是在HTML<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>表格中显示数据库记录。

如下程序清单演示如何显示pubs数据库中<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>authors表中的数据。

<%@ Page Language="C#"%>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat=server>

void Page_Load(Object sender , EventArgs e)

{

SqlConnection conn;

SqlCommand cmd;

SqlDataReader dr;

conn = new SqlConnection( "Server=localhost;Database=Pubs;uid=cdd;psw=123" );

cmd = new SqlCommand( "Select au_fname From authors", conn );

conn.Open();

dr = cmdSelect.ExecuteReader();

DataList1.DataSource = dr;

DataList1.DataBind();


dr.Close();

conn.Close();

}

</Script>

<html>

<head><title>DataList.aspx</title></head>

<body>

<form Runat="Server">

<asp:DataList

ID="DataList1"

Runat="Server">

<ItemTemplate>

<%#DataBinder.Eval(Container.DataItem, "au_fname" )%>

</ItemTemplate>



</asp:DataList>

</form>

</body>

</html>

DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中显示记录时,authors<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>表中每行都显示在独立的HTML<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>表格中,只要你愿意,也可以修改其RepeatLayout<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性把DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的项显示在HTML<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的<div></div><spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中。在默认情况下,<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:red'>RepeatLayout属性值为Table<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>。如果把<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>RepeatLayout属性设为Flow<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,那么每个项就显示在<div></div><spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中。

<asp:DataList RepeatLayout=
Flow<spanlang=EN-US style='mso-ascii-font-family:Verdana;color:black'>”<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> Runat=Server<spanlang=EN-US style='mso-ascii-font-family:Verdana;color:black'>”<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>>

RepeatLayout<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性为Table<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>时,通过设置GridLines<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性可以在每个单元格周围显示线条。GridLines<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性可选值有: Both / Horizontal /Vertical

四、在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中创建多列

DataList
的一个好处的特征是可以以多个列显示数据现。通过设置其<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>RepeatColumnsRepeatDirection<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性,可以控制DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的列的布局。

RepeatColumns
属性决定要显示的列的数量。比如,如果要在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中显示四列的项,那么可以把这个属性设为4<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>。

RepeatDirection
属性句顶列是按水平或垂直方向来重复。在默认情况下,<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>RepeatDirection值为Vertical<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,因此,如果RepeatColumns<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>值为4<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,则列就像这样显示:

Column 1 Column3 Column5 Column7

Column 2 Column4 Column6 Column8

如果把RepeatDirection<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>设为Horizontal<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,而且RepeatColumns<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>值为4<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,那么列就像这样显示:

Column 1 Column3 Column5 Column7

Column 2 Column4 Column6 Column8

注意,即使RepeatDirection<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>值为Vertical<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,还是显示为4<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>个列。RepeatColumns<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>永远是指重复的列的数量,而不是行的数量。
五、捕获DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件中产生的事件

正如第一小节中提到的那样,<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件支持事件冒泡,可以捕获DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>内包含的控件产生的事件,并且通过普通的子程序处理这些事件。讲到这里有些人可能不太明白事件冒泡的好处所在,这样,我们反过来思考:如果没有事件冒泡,那么对于<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList内包含的每一个控件产生的事件都需要定义一个相应的处理函数,如果DataList中包含<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>10000个控件呢?或者更多呢?那我们得写多少个事件处理程序。所以有了事件冒泡,不管DataList中包含多少个控件,我们只需要一个处理程序就可以了。<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件支持五个事件:



1) EditCommand
:由带有<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>CommandName=edit的子控件产生<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

2) CancelCommand:由带有<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>CommandName=cancel的子控件产生<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

3) UpdateCommand:由带有<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>CommandName=update的子控件产生<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

4) DeleteCommand:由带有<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>CommandName=delete的子控件产生<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

5) ItemCommandDataList的默认事件<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

有了这五个事件,那么当我点击了DataList控件中的某一个按钮的时候,应该触发哪一个事件呢?什么时候才触发它们呢?在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ASP.NET中有三个控件带有CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性,分别是Button<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>和ImageButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,可以设置它们的CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性来表示容器控件内产生的时间类型。比如,如果设置DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的一个LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性为update<spanlang=EN-US style='mso-ascii-font-family:Verdana;color:black'>”<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,那么点击此按钮的时候,将会触发DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的CancelCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,我们可以将相关处理代码写到对应的事件处理程序中去。

如下程序清单演示了点击<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中三个CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>分别为edit<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、delete<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>、update<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>按钮。当点击不同的按钮时,在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中产生不同的事件,执行不同的程序:

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat=server>

void Page_Load(Object sender , EventArgs e)

{

if (! IsPostBack ) {

SqlConnection conn;

SqlCommand cmd;

SqlDataReader dr;

conn = new SqlConnection( "Server=localhost;Database=Pubs;uid=cdd;psw=123" );

cmd = new SqlCommand( "Select au_fname From authors", conn );

conn.Open();

dr = cmd.ExecuteReader();


dlstTitles.DataSource = dr;

dlstTitles.DataBind();



dr.Close();

conn.Close();

}

}

void DataList1_ItemCommand( object s, DataListCommandEventArgs e ) {

lblMessage.Text = "<li>Item Command!";

}



void DataList1_EditCommand( object s, DataListCommandEventArgs e ) {

lblMessage.Text += "<li>Editing Item!";

}



void DataList1_DeleteCommand( object s, DataListCommandEventArgs e ) {

lblMessage.Text = "<li>Deleting Item!";

}

void DataList1_UpdateCommand( object s, DataListCommandEventArgs e ) {

lblMessage.Text = "<li>Updating Item!";

}

</Script>

<html>

<head><title>DataListEvents.aspx</title></head>

<body>

<form Runat="Server">

<asp:Label

ID="lblMessage"

BackColor="yellow"

Runat="Server" />

<p>

<asp:DataList

ID="DataList1"

OnItemCommand="DataList1_ItemCommand"

OnEditCommand="DataList1_EditCommand"

OnDeleteCommand="DataList1_DeleteCommand"

OnUpdateCommand="DataList1_UpdateCommand"

GridLines="Both"

CellPadding="4"

Runat="Server">



<ItemTemplate>

<%#DataBinder.Eval(Container.DataItem, " au_fname " )%>

<br>

<asp:LinkButton

Text="Edit!"

CommandName="edit"

Runat="Server"/>

<asp:LinkButton

Text="Delete!"

CommandName="delete"

Runat="Server"/>

<asp:LinkButton

Text="Update!"

CommandName="update"

Runat="Server"/>

</ItemTemplate>

</asp:DataList>
</form>

</body>

</html>

DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中显示的三个LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件分别与相应的程序相关联。当点击名为delete<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的时候,就触发DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件DeleteCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,该事件与DataList1_DeleteCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>函数相关联。

大家注意到与<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList关联的函数都带有一个DataListCommandEventArgs<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的参数。该阐述表示从DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>传递给该函数的信息。DataListCommandEventArgs<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>具有如下属性:

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> CommandArgument:表示来自于产生该事件的控件的CommandArgument<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性值。

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> CommandName:表示产生该事件的命令名称。

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> CommandSource:表示产生该事件的DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件。

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> Item<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>:表示来自DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>的项。就是DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>中发生事件的那一项。该属性非常有用,在后面的章节中会经常使用到!<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>


六、选择DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的项

在第一小节中我们讲到<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件比Repeater<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件多两个模板,SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板可以格式化DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中被选定的项的格式。

数据绑定到<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList后,DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的每一项都有一个索引号,第一项的索引为0<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,依次往下编号。我们可以利用索引来确定DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中具体的项。

DataList
默认以<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ItemTemplateItemTemplate+AlternatingItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板显示数据项,当DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的SelectedIndex<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性(该属性默认值为-1<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,表示不显示SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板)的值为DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>某一项的索引的时候,对应的项将会以SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板显示。

如下程序清单使用DataList来显示一列来自于<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>Authors数据库表中的作者的姓。每个作者的姓作为一个LinkButton<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件呈现。当选择一个作者时,被选定的作者就使用SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>来显示。

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat=server>

void Page_Load(Object sender , EventArgs e)

{

if (! IsPostBack)

{

BindDataList();

}

}
void BindDataList() {

SqlConnection conn;

SqlCommand cmd;

SqlDataReader dr;

conn = new SqlConnection("Server=localhost;Database=Pubs;uid=cdd;psw=123" );

cmd = new SqlCommand( "Select au_lname From Authors", conn );

conn.Open();

dr = cmd.ExecuteReader();

dlstAuthors.DataSource = dr;

dlstAuthors.DataBind();

dr.Close();

conn.Close();

}

void DataList1_ItemCommand( object s, DataListCommandEventArgs e ) {

dlstAuthors.SelectedIndex = e.Item.ItemIndex;

BindDataList();

}

</Script>

<html>

<head><title>DataListSelected.aspx</title></head>

<body>

<form Runat="Server">

<asp:DataList

ID=" DataList1"

OnItemCommand=" DataList1_ItemCommand"

Runat="Server">

<ItemTemplate>

<asp:LinkButton

Text='<%#DataBinder.Eval(Container.DataItem, "au_lname" )%>'

Runat="Server" />

</ItemTemplate>

<SelectedItemTemplate>

<b><i><%#DataBinder.Eval(Container.DataItem,"au_lname" )%></i></b>

</SelectedItemTemplate>

</asp:DataList>

</form>

</body>

</html>

上面代码中DataList1.SelectedIndex= e.Item.ItemIndex语句:表示把被选项的索引赋值给<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件的SelectedIndex<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性。然后调用BindDataList()<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>进行数据的重新绑定。

答疑:<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>在一次课上,讲解ItemCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件和DeleteCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件的时候,有学生问我为什么每次点了CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>为delete<spanlang=EN-US style='mso-ascii-font-family:Verdana;color:black'>”<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的按钮的时候ItemCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件也被触发了呢?因为我平时写程序的时候没注意这个问题,一下子还真把我难住了!<spanstyle='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 回办公室后反复做了实验(通过打开页面的<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>Trace跟踪,在相应的事件里用Trace.Warn()<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>方法输出),最后得出结论:

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> ItemCommand事件是DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件产生的默认事件,任何DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件中CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>为delete/cancel/update/edit<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的按钮被点击后,首先触发的是ItemCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,然后才是相应的事件。

Ø<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 但是当<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件中存在一个普通按钮,点击后触发ItemCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,假设执行功能为选择当前项,此时如果点击了CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>为edit<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的按钮,将当前项显示为编辑状态。这个时候并没有出现当前行既被选中又被编辑的情形,这和以上的结论(先触发<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ItemCommand事件)好象相违背。事实上这并不矛盾,因为DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件中的项同一时刻只能显示一个EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>或SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板,所以执行过程应该是这样的。点击了CommandName<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>为edit<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的按钮后首先触发了ItemCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,将当前的项显示为SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板,然后再触发EditCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,将当前的项显示为EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板,覆盖了前面已经显示的SelectedItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板,只不过因为速度太快,肉眼看不出这个过程而已!

七、使用<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件中的DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合

在选择<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中的一个项时,通常需要获取与这个项相关联的主键的值。可以使用DataKeys集合来获取与一个项想关联的主键的值。<spanstyle='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

假设要在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中显示一个名为Authors<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的数据库表,其中包含两个名为au_id<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>和au_fname<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的列,当拥护选择DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的一个项时,你要提取与被选项相关联的au_id<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>列的值,要实现这个操作,则需要设置DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的DataKeyField<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性:

<asp:DataList
ID="DataList1"
DataKeyField="au_id"
OnItemCommand="DataList1_ItemCommand"
Runat="Server">
如果把数据库表的主键类的名称赋值给<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataKeyField属性,那么当绑定DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>到Authors<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的数据表时,一个名为DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的特殊集合就自动生成了。DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合包含来自数据库表的所以的主键值,起顺序与DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的项相同。

注意:只有当所使用的数据表具有单个主键列时,才可以使用<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:red'>DataKeys集合。也就是说不能使用联合主键。

在创建了<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataKeys集合后,就可以通过传递项的索引值给DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合来获取DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中与相关项关联的主键值。比如,要获取由DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>显示的第三项的主键值,就可以是使用语句:DataList1.DataKeys[2]// DataList1DataList控件的<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ID<spanstyle='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

如果要在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList控件的事件处理函数中发生事件的项的主键值,则可以使用语句:DataList1.DataKeys[e.Item.ItemIndex] // DataList1<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>为DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的ID<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>值

八、编辑<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList中的项★★★★★
可以使用DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件来编辑数据表中的某一条记录,如下图,事实上,在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中完成这样的操作非常的方便,不像在asp<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中需要在多个页面中来回切换。

DataList
控件具有一个名为<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>EditItemTemplate的模板,可以在EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中放置表单控件,以便能在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中编辑特定的项。当DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的EditItemIndex<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性(该属性默认值为-1<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,表示不显示EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板)的值为DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>某一项的索引的时候,对应的项将会以EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板显示。

注意:在DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>中一次只能有一个项被选定来编辑。

如下程序清单演示了如何编辑DataList的项,其中最主要的部分就是<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>UpdateCommand事件的处理程序,因为DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>并不会替你处理更新数据表的操作,你必须自己编写所有的代码:

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat=server>

void Page_Load(Object sender , EventArgs e)

{

if (! IsPostBack ) {

BindDataList();

}

}

void BindDataList() {

SqlConnection conn;

SqlCommand cmd;

SqlDataReader dr;

conn = new SqlConnection("Server=localhost;Database=Pubs;uid=cdd;psw=123" );

cmd = new SqlCommand( "Select au_id, au_lname, phone From Authors Order byau_lname", conn );

conn.Open();

dr = cmd.ExecuteReader();

DataList1.DataSource = dr;

DataList1.DataBind();

dr.Close();

conn.Close();

}

void DataList1_EditCommand( object s, DataListCommandEventArgs e ) {

DataList1.EditItemIndex = e.Item.ItemIndex;

BindDataList();

}

void DataList1_CancelCommand( object s, DataListCommandEventArgs e ) {

DataList1.EditItemIndex = -1;

BindDataList();

}

void DataList1_DeleteCommand( object s, DataListCommandEventArgs e ) {

SqlConnection conn;

string strDelete;

SqlCommand cmdDelete;

string strAuthorID;

strAuthorID = DataList1.DataKeys[(int)e.Item.ItemIndex].ToString();

conn = new SqlConnection("Server=localhost;Database=Pubs;uid=cdd;psw=123" );

strDelete = "Delete Authors Where au_id=@authorID";

cmdDelete = new SqlCommand( strDelete, conn );

cmdDelete.Parameters.Add( "@authorID", strAuthorID );

conn.Open();

cmdDelete.ExecuteNonQuery();

conn.Close();

DataList1.EditItemIndex = -1;

BindDataList();

}

void DataList1_UpdateCommand( object s, DataListCommandEventArgs e ) {

SqlConnection conn;

string strUpdate;

SqlCommand cmdUpdate;

string strAuthorID;



strAuthorID = DataList1.DataKeys[(int)e.Item.ItemIndex].ToString();

TextBox txtLastName = (TextBox)e.Item.FindControl( "txtLastName" );

TextBox txtPhone = (TextBox)e.Item.FindControl( "txtPhone" );

conn = new SqlConnection("Server=localhost;Database=Pubs;uid=cdd;psw=123" );

strUpdate = "Update Authors set au_lname=@lastname, phone=@phone Whereau_id=@authorID";

cmdUpdate = new SqlCommand( strUpdate, conn );

cmdUpdate.Parameters.Add( "@authorID", strAuthorID );

cmdUpdate.Parameters.Add( "@lastname", txtLastName.Text );

cmdUpdate.Parameters.Add( "@phone", txtPhone.Text );

conn.Open();

cmdUpdate.ExecuteNonQuery();

conn.Close();

DataList1.EditItemIndex = -1;

BindDataList();

}
</Script>

<html>

<head><title>DataListEdit.aspx</title></head>

<body>

<form Runat="Server">
<asp:DataList

ID="DataList1"

DataKeyField="au_id"

OnEditCommand="DataList1_EditCommand"

OnCancelCommand="DataList1_CancelCommand"

OnDeleteCommand="DataList1_DeleteCommand"

OnUpdateCommand="DataList1_UpdateCommand"

RepeatColumns="4"

GridLines="Both"

CellPadding="10"

EditItemStyle-BackColor="lightgrey"

Runat="Server">

<ItemTemplate>

<%#DataBinder.Eval(Container.DataItem, "au_lname" )%>

- <%#DataBinder.Eval(Container.DataItem, "phone" )%>

<br>

<asp:LinkButton

Text="Edit!"

CommandName="edit"

Runat="Server" />

</ItemTemplate>

<EditItemTemplate>

<b>Last Name:</b>

<br>

<asp:TextBox

ID="txtLastName"

Text='<%#DataBinder.Eval(Container.DataItem, "au_lname" )%>'

Runat="Server" />

<p>

<b>Phone:</b>

<br>

<asp:TextBox

ID="txtPhone"

Text='<%#DataBinder.Eval(Container.DataItem, "phone" )%>'

Runat="Server" />

<p>

<asp:LinkButton

Text="Update!"

CommandName="update"

Runat="Server" />

<asp:LinkButton

Text="Delete!"

CommandName="delete"

Runat="Server" />

<asp:LinkButton

Text="Cancel!"

CommandName="cancel"

Runat="Server" />

</EditItemTemplate>

</asp:DataList>

</form>

</body>

</html>

运行以上程序,点击其中某一项中的<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>edit按钮的时候,将触发DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的EditCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,通过执行语句DataList1.EditItemIndex =e.Item.ItemIndex;将当前项显示为<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>EditItemTemplate模板,在EditItemTemplate<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>模板中点击cancel<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>按钮的时候,将触发DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的CancelCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,通过执行语句DataList1.EditItemIndex =-1; 将当前项恢复显示为<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ItemTemplate模板;

当点击<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>update按钮的时候,将触发DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的UpdateCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件,在UpdateCommand<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>事件的处理程序中,我们需要取得当前项对应的主键值及修改之后的值才能够完成更新,通过执行语句<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>DataList1.DataKeys[(int)e.Item.ItemIndex].ToString();<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>来获取当前主键值(前提是指定了DataList1<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>的DataKeyField<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>属性值为主键字段),由于DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合返回数据类型为object<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>类型,我们还需要调用其ToString()<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>方法来转换成字符串类型。通过执行语句(TextBox)e.Item.FindControl("txtLastName" )来获得更新后的<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>au_lname的值,FindControl<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>(控件ID)方法通过检索当前项中包含的特定<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:red'>ID的控件,其返回值类型为<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:red'>Control类型,所以还需要强制将其转换为TextBox<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>类型,如果没有找到该ID<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:red'>的控件,则返回0<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,最后通过取得的主键值和更新后的字段的值更新数据库表。最后不要忘了重新绑定一下,否则数据库里最新的数据将不会显示出来。<spanstyle='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>

<spanstyle='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'> 如果要在更新前对更新后的数据进行验证,则可以在<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>EditItemTemplate模板中加入验证控件进行验证。)

本章我们讨论了<spanlang=EN-US style='font-family:"Verdana","sans-serif";mso-hansi-font-family:"Times New Roman";color:black'>ASP.NET框架中包含的两个功能最强大的控件之一DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>,主要学习了一些公共属性、时间冒泡、模板和DataKeys<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>集合。其中最主要的是如何编辑DataList<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>中的项,再以后我们学习DataGrid<spanstyle='font-family:宋体;mso-ascii-font-family:Verdana;mso-hansi-font-family:"Times New Roman";color:black'>控件的时候,我们还会接触一些高级特性,如分页、排序等。<spanstyle='mso-spacerun:yes'> 





posted @ 2012-08-15 18:57  守护神  阅读(225)  评论(0编辑  收藏  举报