36

実際、私は に 1TextBoxを作成しPageload、それを に追加しTextBoxていPanelます。今、私はLinkButton好きAdd Anotherです。

その中にテキストを入力しています。TextBox必要に応じて、[新規作成TextBox] をクリックして作成する必要がありますAdd Another LinkButton

実際、カウントを取得して を再作成できますTextBoxes。しかし、問題は、以前に生成されたテキストに入力したテキストTextboxesが見つからないことです。

誰でも、これに対する解決策を提案できますか?

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 5; i++)
                {
                    TableRow row = new TableRow();
                    for (int j = 0; j < 5; j++)
                    {
                        TableCell cell = new TableCell();
                        TextBox tb = new TextBox();                        
                        tb.ID = "TextBoxRow_" + i + "Col_" + j;                        
                        cell.Controls.Add(tb);                        
                        row.Cells.Add(cell);
                    }                    
                    Table1.Rows.Add(row);
                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }        
    }

Button_Clickこれはサンプルコードです。また、同じコードが書かれています

 protected void ASPxButton1_Click(object sender, EventArgs e)
    {
 int k = Table1.Controls.Count;
}

を取得しCount=0ていButton_Clickます。

4

7 に答える 7

20

あなたがする必要があるのは、ポストバック中に毎回ページロードイベントの前または中に動的コントロールを再インスタンス化/再初期化し、このコントロールをページ/フォーム/プレースホルダーに追加することだけです. 次に、親コントロールが LoadPostData メソッドを呼び出すことで、ポストされたデータがコントロールに自動的に割り当てられます。

記事と動的制御のコードの書き方を確認してください -asp.netでのポストバック中に動的制御イベント、データを維持する方法

ここに画像の説明を入力

于 2013-09-21T08:15:17.860 に答える
14

動的コントロールを使用する場合、それらは次のポストバックまでしか存在しないことを覚えておく必要があります。ASP.NET は、動的に追加されたコントロールを再作成しません。コントロールを複数回再作成する必要がある場合は、PageLoad イベント ハンドラーでコントロールの作成を実行する必要があります (現在、Condition: !IsPostabck を使用して初めて TextBox を作成しているだけです)。これには、動的コントロールでビュー ステートを使用できるという追加の利点があります。通常、ビュー ステートは Page.Load イベントの前に復元されますが、PageLoad イベントのハンドラーでコントロールを作成すると、ASP.NET は、PageLoad イベント ハンドラーの終了後に保持されているビュー ステート情報を適用します。

したがって、条件を削除します: !IsPostback, ページが読み込まれるたびに、TextBox コントロールも作成されます。また、PageLoad ハンドラーの完了後に保存されたテキスト ボックスの状態も表示されます。[明らかに、ViewState を無効にしていません!!! ]

例:

protected void Page_Load(object sender, EventArgs e)
{

    TextBox txtBox = new TextBox();
    // Assign some text and an ID so you can retrieve it later. 

    txtBox.ID = "newButton";
    PlaceHolder1.Controls.Add(txtBox);

}

実行後、テキスト ボックスに何かを入力し、ポストバックを引き起こすボタンをクリックすると何が起こるかを確認します。テキストボックスはまだその状態を維持しています!!!

于 2013-07-11T09:18:10.320 に答える
0

実際、私は自分のタスクを達成するために Javascript を使用しました。そしてそれは次のようになります:

<form id="form1" runat="server" enctype="multipart/form-data" method="post">
        <span style="font-family: Arial">Click to add files</span>&nbsp;&nbsp;
        <input id="Button1" type="button" value="add" onclick="AddFileUpload()" />
        <br />
        <br />
        <div id="FileUploadContainer">
            <!--FileUpload Controls will be added here -->
        </div>
        <asp:HiddenField ID="HdFirst1" runat="server" Value="" />
        <br />
        <asp:Button ID="btnUpload" runat="server" Text="Upload" OnClick="btnUpload_Click" />
    </form>

脚本 :

 <script type="text/javascript">
        var counter = 0;

        function AddFileUpload() {

            var div = document.createElement('DIV');
            div.innerHTML = '<input id="file' + counter + '"name = "file' + counter + '"type="text"/><input id="file' + counter + '" name = "file' + counter + '" type="file" /><input id="Button' + counter + '" type="button" value="Remove" onclick = "RemoveFileUpload(this)" />';

            document.getElementById("FileUploadContainer").appendChild(div);
            counter++;
        }
        function RemoveFileUpload(div) {
            document.getElementById("FileUploadContainer").removeChild(div.parentNode);
        }

        function mydetails(div) {
            var info;
            for (var i = 0; i < counter; i++) {
                var dd = document.getElementById('file' + i).value;
                info = info + "~" + dd;
            }
            document.getElementById('<%= HdFirst1.ClientID %>').value = info;
        }
    </script>

および Upload_Click ボタン内:

for (int i = 0; i < Request.Files.Count; i++)
        {           
           string strname = HdFirst1.Value;
           string[] txtval = strname.Split('~');
            HttpPostedFile PostedFile = Request.Files[i];
            if (PostedFile.ContentLength > 0)
            {
                string FileName = System.IO.Path.GetFileName(PostedFile.FileName);
               // string textname=
                //PostedFile.SaveAs(Server.MapPath("Files\\") + FileName);
            }
        }
于 2013-07-13T03:04:41.577 に答える