DataList控件
工具箱中包括一个DataList控件。该控件可用于创建模板化的列表数据。可以在一个模板化列表中,通过设置模板来控制呈现该列表的HTML。模板描述如何显示列表中的某一项的HTML。
提示:DataList控件提供了一些简单的模板。如果需要精确控制布局,可以考虑使用Repeater控件,该控件将在下文中讲解。
在表中列出了DataList控件提供的7个不同的模板变量,它们可用来定义外观。在这些模板中,除了ItemTemplate模板外,其他都是可选的。
表 DataList控件模板
模板名 说 明
AlternatingItemTemplate 为每一个间隔项提供内容和布局。如果没有定义,在DataList中将为每一项使用ItemTemplate
EditItemTemplate 为当前正在编辑的项提供内容和布局。如果没有定义,在DataList中将为正在编辑的项使用ItemTemplate
FooterTemplate 为页脚提供内容和布局。如果没有定义,DataList将不会有页脚
HeaderTemplate 为标题提供内容和布局。如果没有定义,DataList将不会有标题行
ItemTemplate 必须定义。每一项的内容和布局的默认定义
SelectedItemTemplate 为当前选中的行提供内容和布局。如果没有定义,ItemTemplate将被使用
SeparatorTemplate 为项与项之间的分隔符提供内容和布局。如果没有定义,将不会使用分隔符
为了学习DataList控件,首先,创建一个新应用程序(WebNorthWind-DataControls)或者添加一个页面到已有的应用程序DataControls中。把DataList控件拖到表单中。在“Design”视图中,打开智能标签可以选择数据源。作为练习,选择“New Data Source”项,接着选择“SQL Database”,将新数据源命名为DataListCustomerDataSources。使用已有的指向NorthWind的连接,然后设置选中Customers表中的所有字段。完成后,DataList将被表示字段名称和绑定到数据控件的Label填充。
如果单击“Source”,将看到DataList控件已经定义了许多属性,以便识别它的数据源:
ID="DataList1"
DataKeyField="CustomerID"
DataSourceID="DataListCustomerDataSources">
图:DataList绑定数据控件
在DataList 的开闭标签之间包括一个标签。该标签定义了每一项应该如何显示。在默认的< ItemTemplate>标签中,每个列都用Literal控件表示,而绑定的值则用Label控件表示。这些Label控件的Text属性使用 Eval方法传入数据中的列名创建,如下所示:
Text=
提示:Eval返回的是传入的列名所对应的列数据的值。
有多种可以改善该控件外观的方法。首先,回到“Design”视图,单击“Auto Format…”,选择一个方案(如Classic),这样做将为DataList增加许多样式:
ID="DataList1"
DataKeyField="CustomerID"
DataSourceID="DataListCustomerDataSources"
CellPadding="4"
ForeColor="#333333">
...
...
另外,可以回到智能标签,选择“Edit Templates”,这将使智能标签变为“Template Editing Mode”(模板编辑模式,直到单击“End Template Editing”,该模式才结束),并提供一个下拉菜单来选择需要编辑哪个模板。
可以通过展开或者移动模板中的元素来随意修改模板、添加新的控件等。
作为替代,可以直接在内容文件中添加或者修改模板。选择何种方法由个人决定。每个模板都支持它自己的样式对象,这些对象可以在设计时设置并在运行时修改。
默认情况下,每个项是一个接着一个显示的,位于一个垂直的列中。可以通过把DataList的“Repeat Direction”属性由Vertical设置为Horizontal来修改它,也可以通过设置RepeatColumns属性来设置列的数量。
在DataList控件中,包括一些控制外观和行为的常用属性,它们并不是从Control或WebControl类继承的,如表所示。
表 未从WebControl类继承的DataList控件属性
属 性 类 型 读 写 值 说 明
Caption String × × 作为HTML caption元素显示的文本
CaptionAlign TableCaptionAlign × × Bottom、Left、NotSet、Right、Top
指定caption元素的放置位置
CellPadding Integer × × 单元格内容和边框之间的像素数
CellSpacing Integer × × 单元格之间的像素数
DataKeyField String × × 指定数据源中的键字段
DataKeys DataKeyCollection × × 每条记录的键值的集合
续表 未从WebControl类继承的DataList控件属性
属 性 类 型 读 写 值 说 明
DataMember String × × 设定多成员数据源中的数据成员
DataSource Object × × 为控件设置数据源
EditItemIndex Integer × × 编辑的行,从零开始的行索引。如果没有项被编辑或者清除对某项的选择,设置值为-1
EditItemStyle TableItemStyle × 派生自WebControl.
Style类,目前选中的编辑行的样式
FooterStyle TableItemStyle × 派生自WebControls.
Style类,页脚部分的样式属性
GridLines GridLines × × Both、Horiz- ontal、None、Vertical
设置显示哪些网格线。默认值为None
HeaderStyle
TableItemStyle
×
派生自WebControls. Style类,标题部分的样式属性
Items DataListItemCollection × 控件中的所有项的集合
ItemStyle TableItemStyle × 派生自WebControls.Style 类,控件中每个项的默认样式属性
RepeatColumns Integer × × 设置显示的列数
RepeatDirection RepeatDirection × × Horizontal、Vertical 如果为Horizontal,
项是从左到右,然后从上到下显示。如果是Vertical,项是从上到下,然后从左到右显示的。默认值为Vertical
RepeatLayout RepeatLayout × × Flow、Table
如果为Flow,项显示时不会有表结构,否则会有一个表结构。默认为Table
未从WebControl类继承的DataList控件属性
属 性 类 型 读 写 值 说 明
SelectedIndex Integer × × 当前选中的项的索引,从0开始。如果没有选中任何项,或者清除对某项的选择,将值设置为-1
SelectedItem DataListItem × 返回当前选中的项
SelectedItemStyle TableItemStyle × 派生自WebCon- trols.Style类,控件中选中项的默认样式属性
SelectedValue Object × 返回当前的选中项
SeparatorStyle TableItemStyle × 派生自WebCon- trols.Style类,项与项之间的分隔符的默认样式属性
ShowFooter Boolean × × true、false是否显示页脚,默认值为true。仅当FooterTemplate不为null时有效
ShowHeader Boolean × × true、false 是否显示标题行,默认值为true。仅当HeaderTemplate属性不为null时有效
另外,DataList控件包括多个事件。表列出了其中最重要的几个事件。
表 DataList控件的事件
事 件 事件参数 事件参数属性 说 明
DataBinding EventArgs None 当控件绑定到数据源时触发(继承自Control)
DeleteCommand DataListcommand-EventArgs CommandArgument、CommandName
当单击“Delete”按钮时触发
EditCommand DataListcommand-EventArgs CommandArgument、CommandName
当单击“Edit”按钮时触发
Init EventArgs None 当控件初始化时触发(继承自Control)
续表 DataList控件的事件
事 件 事件参数 事件参数属性 说 明
ItemCommand DetailsViewCom-mandEventArgs- FormViewComm-andEventArgs
CommandArgument、CommandName、CommandSource
当单击控件中的一个按钮时触发
ItemCreated EventArgs none 在控件中的所有行创建完毕后触发
ItemDataBound DataListItemEvent-Args Item 当绑定数据时触发
PreRender EventArgs None 在控件呈现在页面上之前触发(继承自Control)
UpdateCommand DataListcommand-EventArgs CommandArgument、CommandName 当单击“Update”按钮时触发
设计模版:
页眉
页脚
数据记录
交替显示项
选中时的显示方式
编辑时的显示方式
数据记录分隔符
编辑模版,里面可以嵌入控件,绑定数据。
设置外观
RepeatLayout 属性设置显示方式
RepeatDirection 显示方向
RepeatColumns 列数
事件
加入模版列的按钮会将其click事件反升到 ItemCommand 事件,也可设置CommandName 来响应不同的事件,如设为:edit,即引发EditCommand()等。
注:若设为:select 则会引发SelectedIndexChanged 和ItemCommand事件
SelectedItemTemplate模版; 添加详细信息的控件,当用户选择了该项,选择模版则显示。
private void DataList1_ItemCommand(……)
{ switch(e.CommandName)
{
case "select":
this.DataList1.SelectedIndex=e.Item.ItemIndex;
string s=(string)this.DataList1.DataKeys[e.Item.ItemIndex];
//在此获得该条记录的详细数据,在SelectedItemTemplate模版里显示。
break;
case "unselect":
this.DataList1.SelectedIndex=-1;
break;
}
this.DataList1.DataBind();//一定要
}
EditItemTemplate模版
编辑:
this.DataList1.EditItemIndex=e.Item.ItemIndex;
this.DataList1.DataBind();
更新:
得到主键
string s=(string)this.DataList1.DataKeys[e.Item.ItemIndex];
得到模版里的控件
TextBox box=(TextBox)e.Item.FindControl("TextBox1");
更新记录
this.DataList1.DataBind();
取消:
this.DataList1.EditItemIndex=-1;
this.DataList1.DataBind();
删除项
一次勾选多条记录,一次删除
foreach(DataListItem i in this.DataList1.Items)
{
bool IsChecked=((CheckBox)i.FindControl("deletectr")).Checked;
if(IsChecked)
{
string s=(string)this.DataList1.DataKeys[e.Item.ItemIndex];
删除操作 }
}
运行中自定义DataList控件
//当创建DataList控件中的任意项时
private void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
switch(e.Item.ItemType)
{ case ListItemType.Header:
e.Item.ForeColor=Color.Red;
e.Item.BackColor=Color.Black;
break;
case ListItemType.Item:
e.Item.BackColor=Color.Black;
break;
}
}
//当模版中的项被数据绑定时发生,数据被显示到客户端前加以访问的最后机会
private void DataList1_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if((e.Item.ItemType==ListItemType.Header)||(e.Item.ItemType==ListItemType.Item))
{
System.Data.Common.DbDataRecord drv=
(System.Data.Common.DbDataRecord)e.Item.DataItem;
if((decimal)drv["库存量"]<1000)
{
e.Item.ForeColor=Color.Red;
}
}
}
另种方式
if((e.Item.ItemType==ListItemType.Header)||(e.Item.ItemType==ListItemType.Item))
{
DataRowView drv=(DataRowView)e.Item.DataItem;
string department=(string)drv["部门"];
switch(department)
{ case "销售部":
e.Item.BackColor=Color.Black;
break;
case "技术部":
e.Item.BackColor=Color.Red;
break; }
}