如何gridview绑定到数组上面,并设置超链接

原创 2006年05月31日 23:39:00

</head>
<body>
    <form id="form1" runat="server">
    <div style="text-align: center">
        <br />
        <table border="1" cellpadding="0" cellspacing="0" style="width: 429px" bordercolor="#cccccc" bordercolordark="#cccccc" bordercolorlight="#ffffff">
            <tr>
                <td >
                    <table border="0" cellpadding="0" cellspacing="0" style="width: 429px">
                        <tr>
                            <td  style="height: 127px; text-align: center; width: 429px;">
                                &nbsp;
                                 <asp:GridView ID="GridView1" runat="server" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" ShowHeader="False" >
                                     <Columns>
                                         <asp:CommandField ShowDeleteButton="True" />
                                         <asp:TemplateField>
                                             <ItemTemplate>
                                                 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl=<%#"~/humanperson_role_set.aspx?"+Container.DataItem%>     
                                                     Text="设置角色"></asp:HyperLink>
                                             </ItemTemplate>
                                         </asp:TemplateField>
                                     </Columns>
                        </asp:GridView></td>
                          </form>
</body>
</html>

 

后台:  if (!IsPostBack)
        {
            this.GridView1.DataSource = Roles.GetAllRoles();
            this.GridView1.DataBind();
      
        }

最近发现数据绑定的一些东西,以下是我转的

.NET使用动态编译技术,在运行时动态将同一目录的*.aspx文件先生成*.cs,然后调用CompilerServices将其编译成assemblies(可以到你的%SYSTEMROOT%/Microsoft.NET/Framework/V1.x.xxxx/Temporary ASP.NET Files下面看看)。因此了解ASP.NET编译的过程是优化ASP.NET运行效率的关键之一。以常用的数据绑定语法为例,我们可以发现它的转化规则是:

.aspx: 

->

.cs: System.Convert.ToString(data-binding expression);

其中data-binding expression是原封不动复制过来的,这样你写数据绑定表达式的时候就心里有谱了吧。关于常见于数据绑定表达式中的Container、DataItem、DataBinder.Eval是这样:DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。

现在你可以想想下面哪种写法效率最高(以Repeater+DataTable数据源为例):

  1. <@% DataBinder.Eval(Container.DataItem, "ColumnName") %>
  2. <@% DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
  3. <@% DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
  4. <@% ((DataRowView)Container.DataItem)["ColumnName"] %>
  5. <@% ((DataRowView)Container.DataItem).Row["ColumnName"] %>

NOTE: 后两种用法需要引入System.Data名称空间……答案一天后揭晓,欢迎有空的朋友自己测试得出结论!笑脸

 


揭晓+简要分析:

 

乍一看1-3都是使用DataBinder.Eval方法来进行数据绑定计算,而4-5是使用strong type直接获取数据绑定的值。按照我之前的推理,很多朋友会认为4-5都会比1-3快,而实际上第4种用法也是在网上很常见的一种针对DataBinder.Eval而进行的“优化”。

实际上根据我们的测试,第4种写法的效率在某些很常见的情形下(即传入的字段名与数据表内部的字段名大小写有出入时)甚至比不上最普遍的第1种写法。不过原理还是对的,就是避免通过reflection或类似机制(如System.ComponentModel中的PropertyDescriptor机制)获得数据,然而使用DataRowView的indexer的效率在字段数量较多导致Hashtable产生寻址冲突时不如使用其Row属性(DataRow类型)的indexer的效率。原因是DataRowView的indexer实现了view的功能,而这个功能对于大多数应用在这个场合都是不需要的,且它的开销甚至比DataBinder.Eval还要大!(本段内容过于武断,在被反复质疑之下我又做了若干试验寻得正确原因)因此简单的使用第五种写法通常是可以获得较佳的性能的,而最好不要在不必要的时候直接使用DataRowView的indexer。

现在回到1-3的讨论。首先一点,请大家注意看Eval方法的二种overload:

object DataBinder.Eval(object container, string expression)
string DataBinder.Eval(object container, string expression, string format)

注意到ASP.NET在生成的.cs文件中是使用System.Convert.ToString来将Eval的结果转换成string的,因此显式的提供值为null或String.Empty的format参数将使得Eval首先调用第一种方法得到绑定结果的对象,然后直接调用该对象的ToString()方法将其返回到Convert.ToString方法,对于该方法编译器已经在编译期将其连接到Convert.ToString(string)的重载上,而该方法则直接返回传入的字串。那如果直接使用第一种方法呢?虽然第二种方法是先调用第一种方法的,但是由于它的返回值是object类型,编译器将为其选择Convert.ToString(object)的重载,在这个重载方法中将进行一些额外的判断以将对象转换为string类型,而这些额外判断显然带来了额外的开销——尽管基本上算不得主要矛盾。

至于说第3种写法,由于在expression参数中多引入了一层间接,因此需要多进行一次反射以解析表达式,因此效率非常之低。

那这里再卖个关子,请推测第5种方法是否还可以进一步优化?(我是指在最常见的ASP.NET开发情形中):P

通过上面的分析,我们可以得到下面的结论:

  1. DataBinder.Eval是最常用也比较易用的数据绑定表达式写法,但由于其实现机制使用了反射,所以需要关注其所带来的性能损失。通常,当应用开发进入稳定期后可以针对性的对这些表达式进行优化。
  2. 但是优化不是光从字面上就能感觉到的,第4种所谓优化随处可见,然而在某些情况下它反而带来其他环节的开销,带来比较低的执行效率。
  3. 要注意方法重载是一种编译期机制,通过显式告诉编译器需要使用的方法重载,通常可以在得到同样结果的前提下获得更佳的性能。
  4. 性能虽重要,功能价更高——在一般的项目开发中,还是首先关注功能的实现,然后再通过实际测试有针对性的优化比较突出的性能瓶颈。

希望我的这点儿心得对您有所启发。:)

.NET使用动态编译技术,在运行时动态将同一目录的*.aspx文件先生成*.cs,然后调用CompilerServices将其编译成assemblies(可以到你的%SYSTEMROOT%/Microsoft.NET/Framework/V1.x.xxxx/Temporary ASP.NET Files下面看看)。因此了解ASP.NET编译的过程是优化ASP.NET运行效率的关键之一。以常用的数据绑定语法为例,我们可以发现它的转化规则是:


.aspx: 

->

.cs: System.Convert.ToString(data-binding expression);

其中data-binding expression是原封不动复制过来的,这样你写数据绑定表达式的时候就心里有谱了吧。关于常见于数据绑定表达式中的Container、DataItem、DataBinder.Eval是这样:DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。

现在你可以想想下面哪种写法效率最高(以Repeater+DataTable数据源为例):

  1. <@% DataBinder.Eval(Container.DataItem, "ColumnName") %>
  2. <@% DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
  3. <@% DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
  4. <@% ((DataRowView)Container.DataItem)["ColumnName"] %>
  5. <@% ((DataRowView)Container.DataItem).Row["ColumnName"] %>

NOTE: 后两种用法需要引入System.Data名称空间……答案一天后揭晓,欢迎有空的朋友自己测试得出结论!笑脸

 


揭晓+简要分析:

 

乍一看1-3都是使用DataBinder.Eval方法来进行数据绑定计算,而4-5是使用strong type直接获取数据绑定的值。按照我之前的推理,很多朋友会认为4-5都会比1-3快,而实际上第4种用法也是在网上很常见的一种针对DataBinder.Eval而进行的“优化”。

实际上根据我们的测试,第4种写法的效率在某些很常见的情形下(即传入的字段名与数据表内部的字段名大小写有出入时)甚至比不上最普遍的第1种写法。不过原理还是对的,就是避免通过reflection或类似机制(如System.ComponentModel中的PropertyDescriptor机制)获得数据,然而使用DataRowView的indexer的效率在字段数量较多导致Hashtable产生寻址冲突时不如使用其Row属性(DataRow类型)的indexer的效率。原因是DataRowView的indexer实现了view的功能,而这个功能对于大多数应用在这个场合都是不需要的,且它的开销甚至比DataBinder.Eval还要大!(本段内容过于武断,在被反复质疑之下我又做了若干试验寻得正确原因)因此简单的使用第五种写法通常是可以获得较佳的性能的,而最好不要在不必要的时候直接使用DataRowView的indexer。

现在回到1-3的讨论。首先一点,请大家注意看Eval方法的二种overload:

object DataBinder.Eval(object container, string expression)
string DataBinder.Eval(object container, string expression, string format)

注意到ASP.NET在生成的.cs文件中是使用System.Convert.ToString来将Eval的结果转换成string的,因此显式的提供值为null或String.Empty的format参数将使得Eval首先调用第一种方法得到绑定结果的对象,然后直接调用该对象的ToString()方法将其返回到Convert.ToString方法,对于该方法编译器已经在编译期将其连接到Convert.ToString(string)的重载上,而该方法则直接返回传入的字串。那如果直接使用第一种方法呢?虽然第二种方法是先调用第一种方法的,但是由于它的返回值是object类型,编译器将为其选择Convert.ToString(object)的重载,在这个重载方法中将进行一些额外的判断以将对象转换为string类型,而这些额外判断显然带来了额外的开销——尽管基本上算不得主要矛盾。

至于说第3种写法,由于在expression参数中多引入了一层间接,因此需要多进行一次反射以解析表达式,因此效率非常之低。

那这里再卖个关子,请推测第5种方法是否还可以进一步优化?(我是指在最常见的ASP.NET开发情形中):P

通过上面的分析,我们可以得到下面的结论:

  1. DataBinder.Eval是最常用也比较易用的数据绑定表达式写法,但由于其实现机制使用了反射,所以需要关注其所带来的性能损失。通常,当应用开发进入稳定期后可以针对性的对这些表达式进行优化。
  2. 但是优化不是光从字面上就能感觉到的,第4种所谓优化随处可见,然而在某些情况下它反而带来其他环节的开销,带来比较低的执行效率。
  3. 要注意方法重载是一种编译期机制,通过显式告诉编译器需要使用的方法重载,通常可以在得到同样结果的前提下获得更佳的性能。
  4. 性能虽重要,功能价更高——在一般的项目开发中,还是首先关注功能的实现,然后再通过实际测试有针对性的优化比较突出的性能瓶颈。

希望我的这点儿心得对您有所启发。:)

数组绑定到gridview

ArrayList lites = new ArrayList();             lites.Add("one");             lites.Add("two");   ...
  • dingxingmei
  • dingxingmei
  • 2013年03月13日 15:53
  • 605

GridView绑定超链接列加title属性

GridView在绑定超链接时,怎么也找不到title属性在哪里加,没办法,只有自己加了,思路是把超链接列转换成模板列,是这样的,页面文件里的列代码:                         ...
  • wyljz
  • wyljz
  • 2007年07月17日 08:50
  • 2537

GridView实现超链接列和图片列,跳转页面并传递参数

总结GridView实现超链接列和图片列、跳转页面并传递参数的方法。
  • christychan
  • christychan
  • 2015年06月26日 20:01
  • 531

GridView绑定数组

Gridview需要绑定来自一个数组的数据而不是数据库字段的时候,遇到一些问题 可以用ArrayList实现; 下面用的是DataTable,看上去更利索一点。 直接上代码 前台: ...
  • leaf_1007
  • leaf_1007
  • 2015年03月11日 16:36
  • 821

DataSet,DataTable绑定gridview

前台   后台 protected void Button1_Click(object sender, EventArgs e)         {             string...
  • gongth_12
  • gongth_12
  • 2012年11月29日 08:37
  • 1910

GridView的两种数据绑定方式对分页的影响

 GridView支持自动分页,但是对数据源非ObjectDataSource 的支持不全。下面分别介绍ObjectDataSource 和非ObjectDataSource 绑定数据的注意点。1. ...
  • anghlq
  • anghlq
  • 2006年11月18日 11:00
  • 1692

GridView中实现超链接

Gridview实现超链接主要了解其数据绑定。 数据绑定的方式分为: 1. 2. 超链接的方式: 1. 利用gridview中 HyperLinkField          DataNav...
  • u014230987
  • u014230987
  • 2014年03月19日 23:22
  • 682

GridView 动态绑定列

GridView1.DataSource = BLL.GetDataItem();//获取数据 //创建好的GridView中移除某个列: //GridView1.Co...
  • anihasiyou
  • anihasiyou
  • 2014年04月09日 16:06
  • 2863

gridview超链接列链接方法 (转)

asp:GridView ID="grdSent" runat="server"  AllowPaging="True" AutoGenerateColumns="False" OnPageIndex...
  • encienqi
  • encienqi
  • 2010年05月11日 14:59
  • 900

GridView动态绑定列(据条件显示某些列)

有的情况下,GridView数据源的所有数据并不需要全部显示,会根据条件部分的显示,或者是动态的添加删减某些列。 这种情况下,可以先把数据源所有的数据抽取出来,存放在一个DataTable中。 D...
  • BQL_Email
  • BQL_Email
  • 2013年06月18日 14:03
  • 816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何gridview绑定到数组上面,并设置超链接
举报原因:
原因补充:

(最多只允许输入30个字)