【发布时间】:2009-04-15 19:18:45
【问题描述】:
如果我将 GridView 绑定到 SqlDataSource,那么第一次创建页面时,GridView 将显示从数据源检索到的列。但如果在回发时我将 GridView.DataSourceID 设置为 null 或空字符串
protected void Page_Load(object sender, EventArgs e)
{
...
if (IsPostBack)
GridView1.DataSourceID = "";
...
}
,那么 GridView 根本不会显示任何行。但这是为什么呢?
假设 GridView 的 EnableViewstate 设置为 true,那么它应该能够显示在首次创建页面时从数据源检索到的行! 我意识到有人可能会争辩说 Framework 注意到 DataSourceId 已更改并假设 GridView 不需要来自先前数据源的数据,但我假设 Framework 会意识到空字符串或空引用不指向任何数据源,因此不会删除从先前数据源检索到的任何数据 GridView?!
谢谢
编辑:
你好,
基本上,一旦您将 DataSourceID 设置为 null 或空字符串,控件就会将此作为控件使用者的指示,即他们根本不希望绑定任何数据(甚至是 ViewState 数据) .控件在绑定之前检查 DataSourceID,如果它是一个空字符串,那么它不会在其 EnsureDataBound 方法中进行 DataBind。
因此,如果您在 Page_Load() 中将 DataSourceID 设置为 null,但 GridView 仅在绑定之前检查 DataSourceId (这发生在 Page_Load 之后很长时间),那么在检查 DataSourceId 之前,包含来自先前数据源的数据的 ViewState 在 Page_Load 中应该仍然可用() (并且仍然可用,例如,在订阅了导致回发的事件的事件处理程序中)?!
【问题讨论】:
-
我一直在审查我的旧线程......无论如何......如果我将 DataSourceID 设置为 Null(在 Page_Load() 内),那么在回发时我仍然能够访问 GridView 中的数据(直到DataSourceID 已检查)通过 Label1.Text = GridView.Rows[].Cells[].Text;
标签: c# .net asp.net gridview viewstate