0

編集可能な要素と読み取り専用の要素が混在する、SQL からバインドされた Repeater があります。行の「編集」ボタンをクリックすると、編集可能な部分がテキストボックスに変換され、「更新」をクリックすると変更が保存されます。

以下は、[編集] ボタンと [更新] ボタンの OnClick コードの (非常に) 簡略化されたバージョンです。

switch(commandName)
{
    case "Edit":
        Label1.Visible = false; //hide read-only version
        PlaceHolder1.Visible = true; //show editing version

        //Dict1 is Dictionary<string, string> in this example.
        foreach (var key in Dict1)
        {
            //insert a TextBox dynamically into the PlaceHolder
            PlaceHolder1.Controls.Add(new TextBox 
            { 
                ID = "txt" + key, 
                Text = Dict1[key] 
            });
        }
        break;

    case "Update":
        //retrieve user input from dynamically-added TextBoxes
        foreach (var TextBox1 in PlaceHolder1.Controls.Where(c => c.ID.StartsWith("txt")))
        {
            doStuff(TextBox1);
        }

        Label1.Visible = true; //show read-only version
        PlaceHolder1.Visible = false; //hide editing version
        break;
}

問題は、動的に追加された TextBoxes が、ページがポストバックされたときにそこにないことです。デバッガーで調べPlaceHolder1.Controlsましたが、TextBoxes はありません。PlaceHolder1それ自体は Repeater の中にありますが、PostBack で Repeater を再バインドしていません。

TextBox コントロールの代わりに未加工の HTML を使用し、値を Request.Form から引き出すことを検討しましたが、それはハックのように感じます。動的に追加された TextBoxes をポストバック間で永続化するにはどうすればよいですか?


編集:

ここには、大量のサンプル コードがないと示すのが難しい複雑な問題がいくつかあります。ここに大きなものがあります:

  • リピーターの各セルには、読み取り専用テキストと編集可能テキストを混在させることができます (つまり、動的に挿入されるラベルとテキスト ボックス)。
  • 各セルに編集可能な領域がいくつあるかわかりません。元のテキストは のようblah blah @A1@ blah blah @A2@ blah...になり、@A1@、@A2@ などの代わりに置換テキストを挿入する必要があります。編集モードでは、その置換テキストのみが編集可能です。
4

2 に答える 2

4

コントロールを動的に追加すると、ポストバック間でコントロールが保持されません。ポストバック後に、それらをページに再度追加する必要があります。私は通常Page_Loadでそれを行います。次に、それらが追加されると、ポストバック状態はASP.NETページのライフサイクルの後半で正しく復元されます。

それで、

  • ページが読み込まれるたびに動的コントロールを追加する必要があります。
  • ただし、それらを追加すると、ASP.NETはそれらの状態を正しく復元します。

お役に立てれば!

于 2011-04-14T16:01:50.850 に答える
1

考えられる答えの1つは、アイテムテンプレートでテキストボックスを事前定義してから、クリックイベントの特定の行の表示を設定することです。

2番目の可能性は、代わりにGRIDVIEWコントロールを利用するようにリピーターをリファクタリングすることです。箱から出して編集可能なテンプレートをサポートします。

とにかく、何が起こっているのかというと、これらのコントロールは動的に追加されるため、次のポストバックで再作成されないということです。ポストバックでは、コントロールにアクセスする場合は、コントロールを再作成する必要があります。 ただし、値がフォームコレクションに格納されていることを忘れないでください。

myval =  request.form["txt" + key];
于 2011-04-14T16:04:23.490 に答える