回发会破坏GridView列中的用户控件

时间:2009-01-07 12:29:49

标签: asp.net gridview user-controls asp.net-2.0

我有一个ASP.NET GridView,它使用模板列和用户控件来允许我动态构建数据网格。现在我正在实现用于插入行的事件处理程序。为此,我创建了一个默认值数组,并将其添加到充当数据源的数据表中。但是,当在回发时触发我的OnLoad事件时,我的所有模板列都不再具有用户控件。我的gridview最终只是空白,没有任何内容,我的按钮列也消失了(包含添加行,删除行和保存按钮)。

我的行添加事件只是这样做:

    public void AddDataGridRow()
    {
        List<object> defRow = new List<object>();

        for (int i = 0; i < fieldNames.Count; i++)
        {
            defRow.Add(GetDefaultValueFromDBType(types[i]));   
        }

        dt.Rows.Add(defRow);
    }

它是从用户控件中的按钮触发的,其实现如下:

    protected void Button1_Click(object sender, EventArgs e)
    {
        ((Scoresheet)(this.Page)).AddDataGridRow();
    }

我的on load事件在第一次运行时做了很多东西来设置GridView,但是我没有通过使用IsPostBack属性来再次运行它。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            Initialize();
    }

任何人都有任何关于我的用户控件消失的提示吗?

3 个答案:

答案 0 :(得分:3)

你必须在每个page_load上将控件添加到网格中,而不仅仅是(!Postback)

答案 1 :(得分:0)

你在usercontrols和GridView上有EnableViewState = true吗?

答案 2 :(得分:0)

Initialize()调用AddDataGridRow()方法吗?你基本上有两个选择:

  1. 在每次回发时绑定网格,不使用viewstate(performace loss)
  2. 第一次绑定网格(if(!IsPostBack)),并确保用户控件保持其视图状态。
  3. 从您的代码中,不清楚用户控件是否保持viewstate及其中包含的内容。甚至不清楚你所显示的方法的执行顺序是什么。没有绑定逻辑,因此即使您不断添加行,网格仍可能不受约束。请详细说明并显示整个页面代码隐藏。