将GridView DataSourceId设置为“”会导致GridView丢失

时间:2009-04-15 19:18:46

标签: c# .net asp.net gridview viewstate



如果我将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中可用()(并且仍然可用,例如,在订阅导致回发的事件的事件处理程序中)?!

2 个答案:

答案 0 :(得分:4)

如果将DataSourceID设置为null或为空字符串,则控件不会重新绑定到ViewState数据。我在下面链接的文章对原因有很好的解释。

基本上发生的事情是,一旦你将DataSourceID设置为null或空字符串,控件就会将此作为来自控件使用者的指示,表示他们不希望绑定任何字符串根本就是数据(甚至是ViewState数据)。控件在绑定之前检查DataSourceID,如果它是空字符串,则它在DataBind方法中不EnsureDataBound

  

System.What?: DataSource VS. DataSourceID (Internals)

答案 1 :(得分:1)

  

我假设框架会实现   空字符串或空引用   不指向任何数据源   因此不会删除任何数据   GridView从以前的数据中检索   源?

为什么你这么想,你重置了值,当然,girdview必须绑定你重置的新值。