我尝试过多种方式来问这个问题。这是一个很难回答的问题,因为您必须了解正在发生的事情。
什么时候填充 GridView?
nieve的答案是在 PostBack 期间Page_Load
,如果不是PostBack的话:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataSet ds = GetStuffToShow();
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
这样做的问题是,如果是回发,则不会填充网格。网格未填充的原因是因为我们关闭了网格的视图状态。
所以不要看 IsPostBack
我们需要始终填充网格,无论是否回发:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = GetStuffToShow();
GridView1.DataSource = ds;
GridView1.DataBind();
}
这样做的问题是,如果用户对列进行排序,则在和之后OnSorting
调用事件:Page_Init
Page_Load
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataSet ds = GetStuffToShow(e.SortExpression, e.SortDirection);
GridView1.DataSource = ds;
GridView1.DataBind();
}
我们已经运行了两个数据库查询,而只需要一个。
缓存适用于列排序
如果我愿意在列排序期间接受无效缓存,我可以将其存储DataSet
在会话变量中,只要我对任何其他操作使其无效。
问题是在我需要它之后OnSorting
调用事件( ):Page_Load
protected void Page_Load(object sender, EventArgs e)
{
if (AGridViewOnSortingEventIsntBeingRaised)
{
DataSet ds = GetStuffToShow();
StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataSet ds = GetDataSetOutOfSessionSomehowThatDamnWellBetterBeThere();
SomehowSortAReadOnlyDisconnectedDataSet(ds, e.SortExpression, e.SortDirection);
GridView1.DataSource = ds;
GridView1.DataBind();
}
对未知的恐惧
然后我仍然感到恐惧,因为我关闭了 GridView 的视图状态。asp:GridView
当我可以从服务器(或内存)重建它时,我认为只读不需要数十千字节的 base64 编码。
但我相信我有义务将页面返回GridView
到上次呈现页面时的状态。我必须在之前 Page_Load
(即期间Page_Init
)这样做。我有这种恐惧,因为有人这么说。所以我把它变成
protected void Page_Init(object sender, EventArgs e)
{
if (AGridViewOnSortingEventIsntBeingRaised)
{
DataSet ds = GetStuffToShow();
StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
问题在于,这GetStuffToShow
取决于用户在文本框中键入的内容,而这些内容在Page_Init
反正我是在闲逛。这里太热了。希望这个问题能得到解答,不像我最近对asp.net的其他 挫败感