DataList中的超级链接问题,请高手师傅帮忙?

DataList中的超级链接问题,请高手师傅帮忙?,第1张

使用DataList控件

本章内容:

1、理解事件冒泡

2、使用模板

3、在DataList中显示数据

4、在DataList中创建多列

5、捕获DataList控件中产生的事件

6、选择DataList中的项

7、使用DataList控件中的DataKeys集合

8、编辑DataList中的项

本章介绍在ASP.NET框架中功能最强大的两个控件(DataList控件和DataGrid控件)之一的DataList控件。我们将深入探讨DataList控件,学习如何使用该控件显示数据以及编辑数据库数据。

一、理解事件冒泡

在ASP.NET框架包含三个支持事件冒泡的标准控件:Repeater、DataList和DataGrid控件。这些控件可以让你捕获其子控件的时间。当子控件产生一个事件时,事件就“冒泡”传给包含该子控件的容器控件,并且容器控件就可以执行一个子程序来处理该事件。

二、使用模板

在前一章中我们已经介绍过Repeater控件的五个模板(ItemTemplate、AlternationgItemTemplate、SeparatorTemplate、HeaderTemplate、FooterTemplate),可以格式化控件的输出。在DataList控件中除了支持Repeater控件中的五个模板以外,还支持如下两个模板:

1、SelectedItemTemplate:控制如何格式化被选定的项

2、EditItemTemplate:控制如何格式化被编辑的项。

当选定DataList中选中一个项时(即DataList的SelectedIndex属性值为当前选定项的索引值),将显示SelectedItem模板,当在DataList中选择一个项来编辑(即DataList的EditItemIndex属性值为当前选定项的索引值)时,将显示EditItem模板。

三、在DataList中显示数据:

可以像Repeater控件那样来用DataList显示数据库表中的记录。但是,与Repeater控件不同的是:DataList控件的默认行为是在HTML表格中显示数据库记录。

如下程序清单演示如何显示pubs数据库中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=localhostDatabase=Pubsuid=cddpsw=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中显示记录时,authors表中每行都显示在独立的HTML表格中,只要你愿意,也可以修改其RepeatLayout属性把DataList的项显示在HTML的<div></div>中。在默认情况下,RepeatLayout属性值为Table。如果把RepeatLayout属性设为Flow,那么每个项就显示在<div></div>中。

<asp:DataList RepeatLayout=”Flow” Runat=”Server”>

当RepeatLayout属性为Table时,通过设置GridLines属性可以在每个单元格周围显示线条。GridLines属性可选值有: Both / Horizontal / Vertical

四、在DataList中创建多列

DataList的一个好处的特征是可以以多个列显示数据现。通过设置其RepeatColumns和RepeatDirection属性,可以控制DataList的列的布局。

RepeatColumns属性决定要显示的列的数量。比如,如果要在DataList中显示四列的项,那么可以把这个属性设为4。

RepeatDirection属性句顶列是按水平或垂直方向来重复。在默认情况下,RepeatDirection值为Vertical,因此,如果RepeatColumns值为4,则列就像这样显示:

Column 1 Column3 Column5 Column7

Column 2 Column4 Column6 Column8

如果把RepeatDirection设为Horizontal,而且RepeatColumns值为4,那么列就像这样显示:

Column 1 Column3 Column5 Column7

Column 2 Column4 Column6 Column8

注意,即使RepeatDirection值为Vertical,还是显示为4个列。RepeatColumns永远是指重复的列的数量,而不是行的数量。

五、捕获DataList控件中产生的事件

正如第一小节中提到的那样,DataList控件支持事件冒泡,可以捕获DataList内包含的控件产生的事件,并且通过普通的子程序处理这些事件。讲到这里有些人可能不太明白事件冒泡的好处所在,这样,我们反过来思考:如果没有事件冒泡,那么对于DataList内包含的每一个控件产生的事件都需要定义一个相应的处理函数,如果DataList中包含10000个控件呢?或者更多呢?那我们得写多少个事件处理程序。所以有了事件冒泡,不管DataList中包含多少个控件,我们只需要一个处理程序就可以了。DataList控件支持五个事件:

1) EditCommand:由带有CommandName=”edit”的子控件产生

2) CancelCommand:由带有CommandName=”cancel”的子控件产生

3) UpdateCommand:由带有CommandName=”update”的子控件产生

4) DeleteCommand:由带有CommandName=”delete”的子控件产生

5) ItemCommand:DataList的默认事件

有了这五个事件,那么当我点击了DataList控件中的某一个按钮的时候,应该触发哪一个事件呢?什么时候才触发它们呢?在ASP.NET中有三个控件带有CommandName属性,分别是Button、LinkButton和ImageButton,可以设置它们的CommandName属性来表示容器控件内产生的时间类型。比如,如果设置DataList中的一个LinkButton的CommandName属性为“update”,那么点击此按钮的时候,将会触发DataList的CancelCommand事件,我们可以将相关处理代码写到对应的事件处理程序中去。

如下程序清单演示了点击DataList中三个CommandName分别为edit、delete、update的LinkButton按钮。当点击不同的按钮时,在DataList中产生不同的事件,执行不同的程序:

<%@ 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=localhostDatabase=Pubsuid=cddpsw=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中显示的三个LinkButton控件分别与相应的程序相关联。当点击名为delete的LinkButton控件的时候,就触发DataList控件DeleteCommand事件,该事件与DataList1_DeleteCommand函数相关联。

大家注意到与DataList关联的函数都带有一个DataListCommandEventArgs的参数。该阐述表示从DataList传递给该函数的信息。DataListCommandEventArgs具有如下属性:

CommandArgument:表示来自于产生该事件的控件的CommandArgument属性值。

CommandName:表示产生该事件的命令名称。

CommandSource:表示产生该事件的DataList控件。

Item:表示来自DataList的项。就是DataList中发生事件的那一项。该属性非常有用,在后面的章节中会经常使用到!

推荐用ListView空间,因为datalist默认无法分页,而Listview可以很容易分页。

先看Listview下面的代码:ListView主要是模板,LayoutTemplate定义其中结果显示为table。GroupItemCount表示一行显示3个(也就是一行tr里,有3个td)。

td里的内容是ItemTemplate定义的内容。

GroupTemplate保持这样就可以了。

asp:DataPager 是在Listview外面的,定义分页,每页PageSize="5"

PagedControlID="ListView1"把Listview和datapager关联起来。

 <asp:ListView ID="ListView1" runat="server"  DataSourceID="SqlDataSource1" 

            GroupItemCount="3">

             

             <LayoutTemplate>

              

                            <table id="groupPlaceholderContainer" runat="server"   style="">

                                <tr id="groupPlaceholder" runat="server">

                                </tr>

                            </table>

                     

                    <tr runat="server">

                   <td runat="server"  ></td>

                  </tr>

            </LayoutTemplate>

            

            <GroupTemplate>

                <tr id="itemPlaceholderContainer" runat="server">

                    <td id="itemPlaceholder" runat="server"></td>

                </tr>

            </GroupTemplate>

            

            <ItemTemplate>

                <td runat="server" style="">username:

                   <%# Eval("username") %> 

                    <br /> 

                   <%# Eval("id") %> 

                </td>

            </ItemTemplate>

           

             

        </asp:ListView>

 

 

        <asp:DataPager ID="DataPager1" PageSize="5" PagedControlID="ListView1" runat="server">

            <Fields>

                <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />

                <asp:NumericPagerField />

                <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />

            </Fields>

        </asp:DataPager>

不管是label还是别的什么控件.你都可以用这个绑定:

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

如:你可以把它们绑成这样儿:

<asp:DataList id="DataList1" runat="server" ShowHeader="False" ShowFooter="False">

<ItemTemplate>

<div>名称:<%# DataBinder.Eval(Container.DataItem,"bookname")%>

</div>

<div>编号:<%# DataBinder.Eval(Container.DataItem,"bookid")%>

</div>

<div>价格:<%# DataBinder.Eval(Container.DataItem,"bookprice")%>

</div>

<div>日期:<%# DataBinder.Eval(Container.DataItem,"bookdate")%>

</div>

</ItemTemplate>

</asp:DataList>

然后在cs中.直接指定该datalist的DataSource.然后DataBind()就OK了.如:

得到数据为一个Dataset叫ds

this.datalist1.DataSource=ds

this.datalist1.DataBind()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9456952.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存