0

「QuestionTypeId」に応じて、テキストボックス、日付ピッカー、またははい/いいえラジオボタンのいずれかを表示するサーバーコントロールを構築しようとしています。

希望どおりにコントロールを表示していますが、フォームで送信ボタンを押すと、RenderContents メソッドで生成されたテキスト ボックス、日付ピッカー、またはラジオ ボタンがすべて null になります。

生成されたコントロールをビューステートに保存しようとしましたが、null になることはありませんでしたが、ユーザー入力は保存されていませんでした。

必要に応じてコードを投稿します。ただ尋ねてください。

4

5 に答える 5

1

CreateChildControlsでコントロールを作成 (および追加) する必要があると思います。これは、QuestionTypeId の値を Viewstate または ControlState に格納する必要があることを意味します (この値がないとコントロールが機能しないため、この場合は ControlState が適用されると思います)。

于 2008-11-25T13:31:54.003 に答える
0

より簡単な方法は、設計時にすべてのコントロールを作成し、要件に基づいてコントロールを非表示にすることです。

コード例:

protected void Page_Load(object sender, EventArgs e)
{
    txtBox.Visible = QuestionTypeID == 1;
    chkBox.Visible = QuestionTypeID == 2;
}

David が指摘したように動的コントロールを使用する場合は、値 QuestionTypeID を ViewState または ControlState に保存し、その値に基づいて必要なコントロールを作成します。

(コントロールは、ポストバックでもページが読み込まれるたびに作成する必要があり、ViewState を永続化して復元する場合は、ページのライフ サイクルの後半で Page_Load メソッドを作成することはできません)

コード例:

protected void Page_Load(object sender, EventArgs e)
{
    var questionId = ViewState["QuestionTypeID"];

    if(questionId == /* Value to create TextBox */) {
        var txt = new TextBox { ID = "txt" };
        placeHolder.Controls.Add(txt);
    } else if(questionId == /* Value to create Calender */) {
        var cal = new Calender { ID = "cal" };
        placeHolder.Controls.Add(cal);
    }

    /* Once the controls are added they will be populated with the posted values */
}

PS
動的コントロールで ID を指定することは常に良い考えです。
追加されたコントロールをメンバー変数に保存し、別の場所で使用できます (それらが割り当てられた後)
。それらのイベントをサブスクライブできます。ユーザーが新しい値を投稿した場合、メソッドが呼び出されます。

于 2008-11-25T14:04:03.360 に答える
0

私はあなたのアドバイスに従い、次のことを行いました。

1) 質問の種類は、サーバー コントロールのビュー ステートに格納されます。

2) CreateChildControls で、コントロールの新しいインスタンスが作成され、ページのプレース ホルダーに追加されます。

私の問題は、物事が少し奇妙な順序で起動するように見えることです:

1)ページの最初の読み込み時に、子コントロールの作成が起動され、サーバー コントロールの RenderContents メソッドが起動します。

2) ボタンをクリックして新しい連絡先をロードすると、子コントロールの作成がトリガーされ、RenderContents が起動されます。

3) 詳細を入力して保存を押すと、Create Child Controls がトリガーされますが、RenderContents はトリガーされず、コントロールにアクセスして値を取得しようとすると NullReferenceException が生成されます。(コントロールにアクセスするコードをスキップすると、RenderContents が呼び出されてレンダリングされます。

第二に、別の問題は、値 (onDataBind) を設定しようとすると、サーバー コントロールで生成されたテキスト ボックスにアクセスしようとし、別の NullReferanceExeption を取得しようとすることです。

考え?

于 2008-11-25T15:34:17.530 に答える
0

コントロールを動的に追加する場合は、viewstate が復元される前にそれらが再作成されていることを確認する必要があります。

私はしばらくこれを行っていませんでしたが、記憶から、OnInit メソッドでコントロールを再作成する必要があると思います。これは、ポストバック データが読み込まれる前、およびコントロールの値がビューステートから設定される前に発生します。

asp.net ページのライフサイクルを読む価値があるかもしれません。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

于 2008-11-25T13:30:07.780 に答える
0

ユーザー コントロールを作成し、テキスト ボックス、日付ピッカー、ラジオボタンのサーバー コントロールを使用できます。

カスタム サーバー コントロールを作成する場合は、ポストされたデータをコントロール プロパティに追加する必要があります。コントロールの OnInit イベントでこれを行うことができます。

MyProperty = Request.Form("myControl");
于 2008-11-25T13:32:52.033 に答える