1

如果标题看起来很荒谬,我提前道歉。在我陷入困境的情况下,我试图了解这两个问题的答案。我在单击按钮时动态创建用户控件,同时跟踪视图状态中的计数。以下是代码:

private int custControlCountID;

    public int CustControlCountID
    {
        get 
        {
            return (int)(ViewState["CustControlCountID"] == null? 1 : ViewState["CustControlCountID"]); 
        }
        set 
        {
            ViewState["CustControlCountID"] = value; 
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        for (int i = 0; i < CustControlCountID; i++)
        {
            RejRow customControl = (RejRow )LoadControl("~/RejRow .ascx");
            customControl.ID = "rejRow" + i;
            divHolder.Controls.Add(customControl);
        }
    }

    protected void btnNewRow_Click(object sender, EventArgs e)
    {
        CustControlCountID = CustControlCountID + 1;
        RejRow customControl = (RejRow)LoadControl("~/RejRow.ascx");
        customControl.ID = "rejectRow" + CustControlCountID;
        divHolder.Controls.Add(customControl);
    }

我只分享了相关的代码。单击按钮控件已成功添加,但仅添加一次。这是因为 CustControlCountID 在 Page_Init 上始终设置为 1。我了解到 LoadViewState 在 Page_Init 之后调用,因此我设置的值在 Page_Init 中不可用。我还了解到要在 Page_Init 中添加控件,在此期间构建控件层次结构。请帮助我理解这一点。

4

1 回答 1

1

一种理论认为,当ViewState在 Page_init 和 Page_load 之间加载时,您在 Page_init 期间获得的值不是来自加载的视图状态,如果您设置它,它可能会在框架在以下步骤中实际加载它时被覆盖页面生命周期。

您可以尝试通过覆盖该CreateChildControls方法最初加载您的控件。

于 2013-02-25T11:23:21.197 回答