前向做了一个ASCX,主要是封装了GridView,代码如下:<ASP:Label ID="label" SkinID="TableTitle" runat="server" />
<ASP:GridView
ID="gridview"
DataSourceID="datasource"
ShowHeader="false"
ShowFooter="false"
AutoGenerateColumns="false"
OnRowCreated="OnRowCreated"
EmptyDataText="查询无数据"
runat="server">
</ASP:GridView>
<ASP:SqlDataSource ID="datasource" ConnectionString="<%$ ConnectionStrings:GuildDB %>" runat="server" />在使用这个ascx的页面的page_load中会根据IsPostBack来判断使用什么样的SQL查询语句,而且在这个页面中使用到多个此ascx!现在我想要为其中的gridview实现分页功能,我按照MSDN中的方法写上代码之后发现,点击某一页后在OnPageIndexChanging事件中,datasource的seleccommand已经变成空值了,于是该控件什么东西都不会显示(如果我在这里强行将datasource的selectcommand的值设成我一个固定的SQL语句,单对那一个使用该控件的地方来说是正确的,但我这里写的是一个控件,自然希望就不要绑死了。请问各位大虾,我应该如何做呢?

解决方案 »

  1.   

    DataSource的SelectCommand属性因为安全性的考虑并没有纳入.net的ViewState机制,也就是说对它赋值之后发生postback之后所赋的值就没有了,如果楼主一定要按照此思路实现,那么也可以把sql语句存放在控件的ViewState[this.ClientID + "_mySelectCommand"]中另外,自从2001年接触asp.net以来,自己和身边的程序员都不止一次地构思过把DataGrid封装起来实现分页,但是至今为止都没有一个让人满意的方案,所以个人并不支持楼主的这个构思
      

  2.   

    to Eddie005(♂) №.零零伍 (♂) :
    那么目前一般是用什么方案来解决这样的问题呢?自己写一个控件实现?或是使用第三方控件?今天早上想了下,估计用viewstate可以解决问题,不过似乎有点不太完美,如果page将enableviewstate设为false了呢?呵呵,其实我都还没用过viewstate,只是知道有这么个东西,.net我也是在边学边用,不过目前对我的应用来说,用viewstate估计是一个最好的方法,毕竟我不需要写一个通用的控件,只是为了满足我们那个小小站点的需要:)晚上结帖