我有一个gridview,我将一些票据数据加载到。根据用户操作,此gridview将加载不同的sqldatasources并重新显示数据。
这是gridview的标记:
<X:GridViewX ID="gvxTaskList" runat="server"
AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
Width="100%" Height="100%" CssClass="tablestyle"
OnRowCreated="gvxTaskList_RowCreated"
OnPageIndexChanging="gvxTaskList_PageIndexChanging"
OnSorting="gvxTaskList_Sorting">
所以,我有两个问题。
首先,排序事件对我来说根本不起作用。我在数据表中得到一个null。代码:
protected void gvxTaskList_Sorting(object sender, GridViewSortEventArgs e)
{
try
{
System.Data.DataTable dataTable = gvxTaskList.DataSource as
System.Data.DataTable;
if (dataTable != null)
{
System.Data.DataView dataView = new System.Data.DataView(dataTable);
dataView.Sort = e.SortExpression + " " +
ConvertSortDirectionToSql(e.SortDirection);
gvxTaskList.DataSource = dataView;
gvxTaskList.DataBind();
}
}
catch (Exception ex)
{
}
}
private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
string newSortDirection = String.Empty;
try
{
switch (sortDirection)
{
case SortDirection.Ascending:
newSortDirection = "ASC";
break;
case SortDirection.Descending:
newSortDirection = "DESC";
break;
}
}
catch (Exception ex)
{
}
return newSortDirection;
}
if(dataTable!= null)失败,因为它是空的。
第二个问题是分页。当它第一次加载gridview时,分页很好。我有两页数据onload。我可以整天来回翻页,没有任何错误。问题是当我更改数据源并带回三页数据时。我尝试立即从第一页单击第3页,然后重新加载以前的数据(有两页)。任何帮助将不胜感激。
答案 0 :(得分:2)
我开始直接回答,但我认为这是一个思考练习。运行代码一秒钟,看看你在做什么。
不是一个好的模式,对吧?为什么?因为如果你得到的只是NULL,你已经绑定了表单,这将导致数据绑定器爆炸。而且,如果你得到NULL,你就无法排序,这就是你所经历的。
更好的模式是将数据概念与显示它的容器分开(有效地,将域模型(在本例中为数据表)与UI元素分开)。这意味着每次都绑定一种方式。
如何?获取数据。如果您只是调整(例如,相同的数据,不同的排序),您可以在帖子之间在服务器上存储副本(在会话中是一个示例,但还有其他方法)。然后,您可以对数据进行排序和绑定。如果是分页,则请求下一组并绑定。
这个想法是你不依赖于一些似乎是国家的哈利波特魔术,因为网络是无国籍的。相反,你每次都假设无状态并控制流程。
现在,阿尔洛夫有一个有趣的想法,以促进更多的思考。我发现它与问题没有完全相关,但我发现理解网页流程非常有用。如果你每次都加载Page_Load,你就有了数据,但实际上,使用Page_Load进行非回发事件以外的任何事情都是一个糟糕的模式...除非做某事a)每次页面加载[更有可能]或者b)每次有回发[非常不可能,因为你将有事件处理程序]。
这意味着Get Page.PostBack == false是从Page_Load加载并使用事件处理其他所有内容时。
您在Sort事件中有这个,但是您希望从GridView中提取数据,这意味着您希望它已经被绑定。但是,如果已经绑定了,你必须清除它才能绑定,在某些情况下甚至可能无法实现。在这种情况下,你很幸运,因为你得到一个null,这意味着你没有绑定在绑定之上(哎!!!)。排序方法args对于确定用户期望很有用,但您应该自己控制数据并绑定它。这可以是每次访问数据库,也可以将其“缓存”并从缓存中绑定。如果你做很多像排序这样的项目,“缓存”效果最好。会话是您可以在页面点击之间“缓存”的地方。
希望这是有道理的。