3

我有一个 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();
    }

我的加载事件在第一次运行时会做很多事情来设置 GridView,但我不会通过使用 IsPostBack 属性来再次运行它。

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

任何人都知道为什么我的用户控件消失了?

4

3 回答 3

3

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

于 2009-01-07T14:41:28.117 回答
0

您在用户控件和 GridView 上有 EnableViewState=true 吗?

于 2009-01-07T14:31:21.257 回答
0

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

  1. 在每个回发上绑定网格并且不使用视图状态(性能损失)
  2. 仅在第一次绑定 Grid(如果 (!IsPostBack)),并确保您的用户控件保持其视图状态。

从您的代码中,尚不清楚用户控件是否保持视图状态以及它们在其中的内容。甚至不清楚您显示的方法的执行顺序是什么。没有绑定逻辑,所以即使你不断添加行,网格可能仍然没有被绑定。请详细说明一下并显示整个页面的代码隐藏。

于 2009-01-07T14:40:12.130 回答