如果把数据库表的主键类的名称赋值给DataKeyField属性,那么当绑定DataList到Authors的数据表时,一个名为DataKeys的特殊集合就自动生成了。DataKeys集合包含来自数据库表的所以的主键值,起顺序与DataList中的项相同。
注意:只有当所使用的数据表具有单个主键列时,才可以使用DataKeys集合。也就是说不能使用联合主键。
在创建了DataKeys集合后,就可以通过传递项的索引值给DataKeys集合来获取DataList中与相关项关联的主键值。比如,要获取由DataList显示的第三项的主键值,就可以是使用语句:DataList1.DataKeys[2] // DataList1为DataList
控件的ID值
如果要在DataList控件的
事件处理函数中发生事件的项的主键值,则可以使用语句:DataList1.DataKeys[e.Item.ItemIndex] // DataList1为DataList控件的ID值
编辑DataList中的项
可以使用DataList
控件来编辑数据表中的某一条记录,,事实上,在DataList中完成这样的操作非常的方便,不像在
asp中需要在多个页面中来回切换。
DataList控件具有一个名为EditItemTemplate的模板,可以在EditItemTemplate中放置
表单控件,以便能在DataList中编辑特定的项。当DataList的EditItemIndex属性(该属性默认值为-1,表示不显示EditItemTemplate模板)的值为DataList某一项的索引的时候,对应的项将会以EditItemTemplate模板显示。
注意:在DataList中一次只能有一个项被选定来编辑。
如下程序清单演示了如何编辑DataList的项,其中最主要的部分就是UpdateCommand事件的处理程序,因为DataList并不会替你处理更新数据表的操作,你必须自己编写所有的代码: <%@ Page Language='C#' %>
<%@ Import Namespace='System.Data.SqlClient' %>
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 by au_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 Where au_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();
}
DataListEdit.aspxID='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'>
<%#DataBinder.Eval(Container.DataItem, 'au_lname' )%>
- <%#DataBinder.Eval(Container.DataItem, 'phone' )%>
Text='Edit!'
CommandName='edit'
Runat='Server' />
Last/b>
ID='txtLastName'
Text='<%#DataBinder.Eval(Container.DataItem, 'au_lname' )%>'
Runat='Server' />
Phone:
ID='txtPhone'
Text='<%#DataBinder.Eval(Container.DataItem, 'phone' )%>'
Runat='Server' />
Text='Update!'
CommandName='update'
Runat='Server' />
Text='Delete!'
CommandName='delete'
Runat='Server' />
Text='Cancel!'
CommandName='cancel'
Runat='Server' />
运行以上程序,点击其中某一项中的edit按钮的时候,将触发DataList控件的EditCommand事件,通过执行语句DataList1.EditItemIndex = e.Item.ItemIndex;将当前项显示为EditItemTemplate模板,在EditItemTemplate模板中点击cancel按钮的时候,将触发DataList控件的CancelCommand事件,通过执行语句DataList1.EditItemIndex = -1; 将当前项恢复显示为ItemTemplate模板;
当点击update按钮的时候,将触发DataList
控件的UpdateCommand事件,在UpdateCommand事件的处理程序中,我们需要取得当前项对应的主键值及修改之后的值才能够完成更新,通过执行语句DataList1.DataKeys[(int)e.Item.ItemIndex].ToString();来获取当前主键值(前提是指定了DataList1的DataKeyField属性值为主键字段),由于DataKeys集合返回数据类型为object类型,我们还需要调用其ToString()方法来转换成字符串类型。通过执行语句(
TextBox控件ID”)方法通过检索当前项中包含的特定ID的控件,其返回值类型为Control类型,所以还需要强制将其转换为TextBox类型,如果没有找到该ID的控件,则返回0,最后通过取得的主键值和更新后的字段的值更新数据库表。最后不要忘了重新绑定一下,否则数据库里最新的数据将不会显示出来。
(如果要在更新前对更新后的数据进行验证,则可以在EditItemTemplate模板中加入验证控件进行验证。)
HTML
定义和用法
datalist 及其选项不会被显示出来,它仅仅是合法的输入值列表。
请使用 input 元素的 list属性来绑定 datalist。
提示:不能控制 datalist 的位置,并且不能将其与服务器的数据进行绑定。
HTML4.01 与 HTML5之间的差异
全局属性
accesskey、class、
contenteditable、contextmenu、data-*、draggable、
dir、hidden、spellcheck、style、tabindex、title
实例
浏览器支持
目前只有 Firefox 和 Opera 支持