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);
    }

関連するコードのみを共有しました。ボタンをクリックすると、コントロールが正常に追加されますが、一度だけ追加されます。これは、Page_InitでCustControlCountIDが常に1に設定されているためです。LoadViewStateはPage_Initの後に呼び出されるため、設定している値はPage_Initでは使用できないことを学びました。また、コントロール階層が構築される間にPage_Initに追加されるコントロールについても学びました。これを理解するのを手伝ってください。

4

1 に答える 1

1

理論によれば、ViewStatePage_initとPage_loadの間にロードされるため、Page_init中に取得する値は、ロードされたビューステートからのものではなく、設定すると、フレームワークが次のステップで実際にロードするときにオーバーライドされる可能性があります。ページのライフサイクル。

メソッドをオーバーライドすることで、最初にコントロールをロードしてみることができますCreateChildControls

于 2013-02-25T11:23:21.197 に答える