`

ASP.NET服务器控件

阅读更多

 

5.数据绑定控件

 

GridView控件

显示一个二维表格数据,每列表示一个字段,每行表示一条记录。它可以绑定到SqlDataSource,ObjectDataSource,LinqDataSource等数据源控件。内置排序功能。内置数据分

页功能(但这是在客户端分页,如果数据量很大,建议在服务器端分页)。内置行选择功能。内置

更新和删除记录功能。可以指定多个主键字段(当把GridView绑定到数据源控件后,就会为

GridView指定DataKeyNames属性,该属性是一个数组类型,默认是数据源控件所绑定表的主键,也

可以指定多个主键:DataKeyNames="ID,Name",设定完后,会自动将主键字段的值添加到DataKeys

集合,如获得第一个主键字段的值:object key=GridView1.DataKeys[0].Value;)提供以编程方

式访问GridView对象模型,动态设置属性,处理事件等。提供用于超链接列的多个数据字段。可

以通过主题和样式进行自定义外观。其生成的客户端代码是一个table。

 

如果在其绑定的SqlDataSource数据源控件中设置了生成Insert,Update,Delete选项,那么在

GridView的智能列表里也将显示启用编辑,启用删除的选项。当绑定了SqlDataSource数据源控

件后,这时没有选择启用编辑等,可以看到默认代码如下:

<asp:gridview ID="Gridview1" runat="server" AutoGenerateColumns="False" 

            DataKeyNames="id" DataSourceID="Sqldatasource1">

        <Columns>

            <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" 

                ReadOnly="True" SortExpression="id" />

            <asp:BoundField DataField="content" HeaderText="content" 

                SortExpression="content" />

            <asp:BoundField DataField="createtime" HeaderText="createtime" 

                SortExpression="createtime" />

            <asp:BoundField DataField="userip" HeaderText="userip" 

                SortExpression="userip" />

            <asp:BoundField DataField="newsid" HeaderText="newsid" 

                SortExpression="newsid" />

        </Columns>

    </asp:gridview>

每一列都是一个BoundField类,这是GridView的默认列类别,还有其他类别:ButtonField(显示一

列命令按钮,用于添加移除等)CheckBoxField(显示一列复选框,用于布尔值的字段)

CommandField(当我们启用删除编辑等时产生的就是这种类列)HyperLinkField(显示一列超链接

)ImageField(显示一列图像)TemplateField(自定义模板列,开发人员可以创建自定义的列字段)

在智能列表中选添加列,就能添加这些类型的列。要编辑这些列,就在智能列表的编辑列里,不过

对于每一种类列,它们的属性也是不一样的,只有HeaderText(列头显示的文本)FooterText(列尾

显示的文本,通常用来显示统计信息)及一些控制样式的属性相同外,其余都很不同。

ButtonField类型的列显示成纯文本,这种列实用的属性有:DataFormatString(格式化该列的值,

如果对日期型的值运用格式化,要把HtmlEncode设为false)ApplyFormatInEditMode(是否在该列

处于编辑状态时运用格式化)我们在设计视图中选择一列,这时在智能列表中就能左右移动这些

列相对的位置(前提是编辑列时将自动生成列去掉,然后添加所要想显示的列再设置样式什么的,否则将自动生成数据库里的字段,而代码里却没有这些列,自然

也无法选中这些列来左右移动了)。

使用TemplateField模板列(除了添加以外,还可通过在编辑列里的转换为TemplateField模板列

将其他类列转换,模板列很灵活,比如说将上面的newsid新闻id显示为新闻名称),转化后,由原来

的<asp:BoundField DataField="newsid" HeaderText="newsid" SortExpression="newsid" />

变成了: <asp:TemplateField HeaderText="newsid转换的模板列" SortExpression="newsid">

                <EditItemTemplate>

                    <asp:TextBox ID="TextBox1" runat="server" Text='<%#      Bind("newsid")%>'></asp:TextBox>

                </EditItemTemplate>

                <ItemTemplate>

                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("newsid") %>'>

                    </asp:Label>

                </ItemTemplate>

                <ItemStyle HorizontalAlign="Center" />

            </asp:TemplateField>

只有模板列TemplateField才可以进行编辑模板

GridView为我们自动添加了两种属性模板:<EditItemTemplate>和<ItemTemplate>,它们分别指

的是该列在编辑模式时的显示及非编辑模式时的显示,里面的显示控件也可以改(在智能列表的

编辑模板里,进到了里面可以把任何控件拖过来替换TextBox和Label(这些控件也有智能列表,用

来给这些控件绑定数据,一般控件要绑定的属性都是Text,如上面的Text='<%# Bind("newsid") 

%>',还要在下面指定代码表达式,就是Text后面的,当然根据需要可以选双向绑定Bind或单项绑

定Eval,前者能对数据进行更新,后者只能显示。如果在后台写了处理字段值的方法,也可以加入

<%#方法名(Eval("newsid"))%>,如果这些控件是数据绑定控件也可以在这里为其指定数据源,在

更新时,如果控件是TextBox则自动获得其值更新,如果控件是列表控件如下拉列表框,除了要在

选择数据源里指定其所要显示的字段和其值指向的字段外,还要在DataBings里设置

SelectedValue的双向绑定字段,因为更新时要用获得的值来更新SelectedValue所绑定的字段),里面还有一个智能列表可以选择其他模板进行编辑)其他属性模板有HeaderTemplate,FooterTemplate等。

 

 

GridView控件的选择功能,在智能列表启用了选择功能后,我们在选择了一行时可以通过

GridView的SelectRowStyle属性设置被选择行的样式。当单击选择按钮时,会触发2个事件

SelectIndexChanging事件(该事件在选择前触发,可以在事件中响应并取消操作)

SelectIndexChanged事件(如果想在选择后触发一些其他业务逻辑,可以响应该事件)

GridView还有一些很有用的属性SelectedIndex(获取所选行的索引号)SelectedDataKey(获取

DataKey对象,从而获取该行的主键的值)SelectValue(获取选中行的值)SelectedRow(获取一个

GridViewRow对象的引用,该对象就是所选中的行)。

用Label控件表示出所选行的一些信息的代码:

 protected void Gridview1_SelectedIndexChanged(object sender, EventArgs e)

        {

            int selindex = Gridview1.SelectedIndex;  //获得当前行的索引

            string dakey = Gridview1.SelectedDataKey.Values["id"].ToString();  //获

得当前行的主键id的值,如果只有一个主键可写成Gridview1.SelectedDataKey.Value

            string cellname =((HyperLink)Gridview1.SelectedRow.Cells[4].FindControl("HyperLink1")).Text; //获得当前行的第四个单元格的值,而该列时模板列并且里面有一个Hyperlink控件,FindControl返回的是Control类型

            string cellname2 = Gridview1.SelectedRow.Cells[3].Text;  //获得第三个单元格的值

            Label1.Text = "当前是第" + selindex + "列<br/>" + "该行主键值是" + dakey + "<br/>" + "该行第四列的值是" + cellname + "<br/>" + "该行第三列的值是" + cellname2;

        }

 

创建主从表,当用户选中一个GridView(主)控件的一行时,就以此行的主键值为搜索,搜索出另一

个表中与此主键值一致的那些行显示在另一个GridView(从)中。而这些只要再加一个GridView(从)与SqlDataSource,把GridView(从)配置数据源中的where子句的源设为Control,然后在参数属性中选择GridView(主)就可以了,可以看到自动绑定到了GridView(主)的SelectedValue属性了,这时点添加即可,当然别忘了指定GridView(主)的DataKeyNames。

 

 

GridView控件事件按类分为

控件呈现事件

DataBinding(GridView绑定到数据源时立即触发)

DataBound(GridView绑定到数据源后触发)

RowCreated(GridView中行被创建后触发)

RowDataBound(GridView中每行绑定到数据后触发)

编辑记录事件

RowCommand(单击GridView内按钮时触发)

RowUpdating(GridView更新记录前发生)

RowUpdated(GridView更新记录后发生)

RowDeleting(GridView删除记录前发生)

RowDeleted(GridView删除记录后发生)

RowCancelingEdit(取消更新记录时发生)

选择排序分页事件

SelectedIndexChanging(在行被选择只前发生)

SelectedIndexChanged(在行被选择后发生)

Sorting(在排序前发生)

Sorted(在排序后发生)

PageIndexChanging(在当前页被改变前发生)

PageIndexVhanged(在当前页被改变后发生)

对于有些数据我们希望他们以不同颜色显示出来,这与控件呈现有关,我们就要用到控件呈现里面的事件。

RowCreated可以用来向行添加自定义内容,自定义格式,该事件是在数据绑定之前发生,所以对数据的处理(如获得数据),不要在该事件中处理,一般只处理一些样式什么的。

RowDataBound可以在该事件中修改绑定到该行的数据的值,如可以让布尔字段显示特定图标,如获得某个单元格的数值,因为该事件是发生在数据绑定之后,这时已经获得数据了。

RowCreated事件在每次PostBack都会被触发,而RowDataBound如果在GridView没有绑定数据源的情况下不会被触发。这俩事件都是在GridView控件呈现之前触发。事实上是先RowCreated生成一行,再RowDataBound绑定数据,再生成一行,再绑定数据,直到绑定完。

  protected void GridView3_RowCreated(object sender, GridViewRowEventArgs e)

        {

            if (e.Row.RowType == DataControlRowType.DataRow)

            {

                if (e.Row.RowState != DataControlRowState.Selected)

                {

                    e.Row.Attributes.Add("onmouseover", 

 

"currentcolor=this.style.backgroundColor;this.style.backgroundColor='#EEEEFF';this.style.cursor='pointer';");

                    e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor");

                }

            }

        }

 

        protected void GridView3_RowDataBound(object sender, GridViewRowEventArgs e)

        {

            if (e.Row.RowType == DataControlRowType.DataRow)

            {

                int id = int.Parse(e.Row.Cells[2].Text);

                if (id > 32)

                {

                    e.Row.ForeColor = System.Drawing.Color.Red;

                    e.Row.Font.Bold = true;

                }

            }

        }

关于给服务器端控件添加客户端事件

以上代码通过RowCreated事件控制样式RowDataBound事件获得数据然后进行处理。俩事件都有一个GridViewRowEventArgs参数,通过该参数的Row属性获得正在创建或刚绑定完数据的行,然后通过RowType和RowState这俩属性分别判断该行的类型和状态。它们是通过枚举类型

DataControlRowType(DataRow数据行Footer脚注行Header标头行EmptyDataRow空行Pager页导航行Separator分隔符行)和

DataControlRowState(Alternate处于交替行Edit行处于编辑状态Normal(行处于默认状态)Selected(行处于被选中状态))来获得。

 

 

以下代码为GridView增加统计信息,统计信息一般写在脚注行里,这就要在GridView里设置属性

ShowFooter为true。至于模板列,可以在其FooterTemplate里拖进控件用于显示。

 

  int sumnewid = 0;    //总的新闻id

  int sumcateid = 0;  //总的类别id

  int sumncid = 0;    //总的新闻id加类别id

  int ncid = 0;       //单行新闻id加类别id

 protected void GridView3_RowDataBound(object sender, GridViewRowEventArgs e)

        {

            if (e.Row.RowType == DataControlRowType.DataRow)

            {

                  if (e.Row.RowState!=DataControlRowState.Edit&&e.Row.RowState!

 

=DataControlRowState.Insert)

                {

                     ncid=int.Parse(e.Row.Cells[0].Text)+int.Parse(e.Row.Cells

 

[1].Text);

                     e.Row.Cells[2].Text = ncid.ToString();

                    sumncid += ncid;

                    sumcateid+=int.Parse(e.Row.Cells[0].Text);

                    sumnewid+=int.Parse(e.Row.Cells[1].Text);

                }

             }

              if (e.Row.RowType==DataControlRowType.Footer)

            {

                e.Row.Cells[0].Text = "类别ID之和是" + sumcateid.ToString();

                e.Row.Cells[1].Text = "新闻ID之和是" + sumnewid.ToString();

                ((Label)e.Row.Cells[2].FindControl("Label2")).Text = "类别ID加新闻

 

ID之和是" + sumncid.ToString();

            }

         }

注意脚注行不属于DataRow,不能绑定数据,只能显示数据。

 

当在智能列表里启用排序后,那些列的属性SortExpression里设置的字段(一般就是头注行)就会变为超链接,每当点击他们就会在升序和降序中切换。分页的样式设计基本就在GridView的PageSeting,PageStyle,PageSize里设置。

 

 

补充:Gridview等数据绑定控件的selectvalue方法得到的是datakeynames属性指定的字段的值。

Gridview控件中只要是按钮不管是链接按钮还是一般按钮只要定义了RowCommand事件,都会先触发该事件。如你按了

选择按钮也会先触发RowCommand事件再触发SelectedIndexChanged事件(如果你定义了的话),如果只想让特定按钮触发RowCommand事件,可以用这些按钮的CommandName属性来声明,在RowCommand事件的e.CommandName可以获得这些按钮的CommandName属性,然后if(e.CommandName=="Delete"删除按钮的CommandName属性)来判断是否执行该事件。

GridView等控件手工绑定而不是通过数据源绑定数据执行删除时如果删除按钮的CommandName属性为Delete,还会默

认执行RowDeleting事件,可以更改删除按钮的CommandName属性或将RowDeleting事件设置为空事件,编辑按钮也是一样。

 

分享到:
评论

相关推荐

    ASP.NET服务器控件与组件开发电子书及示例代码

    ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发...

    asp.net服务器控件高级编程(带源文件)

    ASP.NET服务器控件是.NET框架中的核心组成部分,用于构建动态Web应用程序。在ASP.NET中,服务器控件提供了丰富的功能,使开发人员能够更方便地创建交互式的网页。本教程“ASP.NET服务器控件高级编程”深入探讨了这些...

    ASP.NET 服务器控件开发技术与实例

    本教程将深入探讨ASP.NET服务器控件的开发技术,并通过实例来帮助你理解和应用这些知识。 一、服务器控件基础 ASP.NET服务器控件是运行在服务器端的,它们在HTML发送到客户端之前被处理。服务器控件具有丰富的属性...

    ASP.NET 服务器控件:DropDownCheckBoxList

    ASP.NET 服务器控件:DropDownCheckBoxList ,支持下拉多选,支持.NET3.5 支持主流浏览器IE8及以上版本 FF3.5+,Chrome 9+,Safari 5 等浏览器。

    asp.net服务器控件与组件开发

    《ASP.NET服务器控件与组件开发》是一门深入探讨ASP.NET技术中服务器控件和组件构建的专业主题。在ASP.NET框架中,服务器控件和组件是网页开发的核心元素,它们为开发者提供了丰富的功能,简化了网页交互逻辑的实现...

    ASP.NET服务器控件与组件开发

    ASP.NET服务器控件与组件开发是Web开发领域中的核心概念,尤其对于构建动态、交互性强的Web应用程序至关重要。ASP.NET是Microsoft .NET框架的一部分,它提供了丰富的服务器控件和组件库,使得开发者能够以声明式的...

    ASP.NET 服务器控件开发技术与实例 光盘源码

    资源共享啦!!... &lt;&lt;ASP.NET 服务器控件开发技术与实例&gt;&gt;附光盘代码 是服务器控件开发的入门及应用的书,想做ASP.NET服务器控件开发的不妨看看,里面带有10个经典控件开发实例源码和DEMO...

    《ASP.NET服务器控件开发技术与实例》一书光盘源程序代码

    《ASP.NET服务器控件开发技术与实例》一书的光盘源程序代码是学习和深入理解ASP.NET服务器控件开发的宝贵资源。该资源由C#编程语言和Visual Studio 2005(VS2005)环境构建,旨在为开发者提供实战性的指导和示例,...

    ASP.net服务器控件与组件开发

    ASP.net服务器控件与组件开发

    ASP.NET服务器控件开发(en)

    ASP.NET服务器控件开发(en) 很好的服务器控件开发资料

    Asp.Net服务器控件开发 源代码

    Asp.Net服务器控件开发 源代码 书中所有工程均采用Visual Studio.NET 2003进行开发,其Microsoft .NET Framework版本为1.1.4322。更详细的说明见书的“光盘使用必读”。

    ASP.NET服务器控件开发技术与实例

    ASP.NET服务器控件是.NET框架下用于构建动态Web应用程序的核心组件。它们在Web页面的生命周期中扮演着重要角色,提供了一种与客户端交互的方式,并在服务器端处理用户输入。本教程将深入探讨ASP.NET服务器控件的开发...

    asp.net服务器控件

    ASP.NET服务器控件是.NET Framework框架中用于构建动态Web应用程序的核心元素之一。这些控件提供了一种方便的方式来创建用户界面,使开发人员能够通过拖放和配置属性来快速开发功能丰富的网页。在“asp.net服务器...

    Asp.Net服务器端控件

    Asp.Net服务器端控件是.NET框架中用于构建动态Web应用程序的关键组件。这些控件提供了一种方便的方式来创建交互式的用户界面,使开发者能够轻松地处理网页上的数据和功能。在Asp.Net中,服务器端控件是核心的开发...

    asp.net服务器控件组件与开发

    ASP.NET服务器控件和组件是构建动态Web应用程序的关键元素,它们为开发者提供了丰富的功能和便捷的接口,使得在网页上创建交互式用户界面变得简单。本文将深入探讨这些控件和组件的开发过程,帮助初学者快速掌握核心...

    ASP.NET服务器控件高级教程

    ASP.NET服务器控件是.NET Framework下开发Web应用程序的重要组成部分,它们为开发者提供了丰富的交互性和功能。在ASP.NET中,服务器控件是运行在服务器端的,可以处理用户输入、生成HTML代码并将其发送到浏览器。这...

    ASP.NET服务器控件高级编程

    ASP.NET服务器控件高级编程 ASP.NET 服务器控件 自定义控件

Global site tag (gtag.js) - Google Analytics