2

このように、テキスト変更イベントでバックエンドによっていくつかのTextBoxを作成しています:

protected void txtHowMany_TextChanged(object sender, EventArgs e)
    {
          int totalSections = Convert.ToInt32(txtHowMany.Text.Trim());

            for (int i = 1; i <= totalSections; i++)
            {
                TextBox tbx = new TextBox();
                tbx.Text = "";
                tbx.ID = "section" + i;
                tbx.Style.Add("width", "90%");
                tdSectionsAdd.Controls.Add(tbx);
            }
            trSectionsName.Visible = true;
    }

txtHowManyの場合、自動ポストバックはtrueであるため、数値を入力すると、テキストボックスが生成され、テーブル分割に追加されます。

問題は、次のように生成されたテキストボックスからテキストを取得しようとしていることです。

protected void btnSave_click(object sender, EventArgs e)
    {
      int numbersOfSectionsToSave = 1;
                int sectionsToSave =Convert.ToInt32(txtHowMany.Text.Trim());

                for (int i = 1; i < sectionsToSave; i++)
                {
                    Sections section = new Sections();
                    section.CourseId = result;
                    section.OrganizationId = course.OrganizationId;

                    foreach (Control c in tdSectionsAdd.Controls)
                    {
                        if (c.GetType() == typeof(TextBox))
                        {
                          TextBox  txtBox = (TextBox)c;
                            string id = "section" + i;
                            if (txtBox.ID == id)
                            {
                                section.Name = txtBox.Text.Trim();
                            }
                        }
                    }

                    string name = Request.Form["section1"];
                    section.CreatedBy = "Admin";
                    section.CreationDate = DateTime.Now;
                    section.ModifiedBy = "Admin";
                    section.ModificationDate = DateTime.Now;
                    numbersOfSectionsToSave += section.SaveSection();
    }

しかし、tdSectionsAddのコントロールには0カウントが表示されます。コントロールにアクセスしようとする前にコントロールが追加されますが、それでもtdにはコントロールが表示されません。助けてください、どうすればこれらのテキストボックスを入手できますか?

ありがとう!

4

2 に答える 2

2

各ポストバックにそれらを追加する必要があります。変数をViewStatetotalSectionsに保存して、ページの読み込みにも追加できるようにします。

protected void AddTextBoxes()
{
    int totalSections;
    if (int.TryParse(Convert.ToString(ViewState["TotalSections"]), out totalSections)
    {
        for (int i = 1; i <= totalSections; i++)
            {
                TextBox tbx = new TextBox();
                tbx.Text = "";
                tbx.ID = "section" + i;
                tbx.Style.Add("width", "90%");
                tdSectionsAdd.Controls.Add(tbx);
            }
        trSectionsName.Visible = true;
    }
}
protected void txtHowMany_TextChanged(object sender, EventArgs e)
    {
          ViewState["TotalSections"] = Convert.ToInt32(txtHowMany.Text.Trim());

            tdSectionsAdd.Controls.Clear();
            AddTextBoxes();
    }

protected void Page_Load(object sender, EventArgs e)
{
    AddTextBoxes();
}
于 2012-10-29T15:14:34.593 に答える
1

Dynamic Createdコントロールは、そのページのPage_Initで「再作成」されていない場合、ポストバックで「非表示」になります。

それらがpage_initで作成された場合にのみ、ページのビューステートがそれらの情報で更新されます。

長い外植: ポストバック(または部分的なポストバック)を実行するとき、それらのコントロール(または少なくともユーザーがそれらに入力した値)にアクセスできるようにする必要があります。データがビューステートにあることはわかっていますが、ASP.NETは、ViewStateアイテムがどのコントロールに属しているかを実際には認識していません。同じインデックスを介してビューステートアイテムとコントロールを一致させることのみを認識します(たとえば、ビューステートツリーのアイテムnをコントロールツリーのアイテムnに一致させます)。したがって、動的コントロールのデータを取得するには、ページがポストバックされるたびにコントロールを再作成する必要があります。ただし、これを機能させるには、Page_LoadではなくPage_Init関数でコントロールを再作成する必要があります。なんで?ViewStateが作成されるとき、すべてのコントロールがすでに存在している必要があるためです。 ページのライフサイクル

ビューステートが初期化後、ページのロード前にロードされることがわかるように、これはMSDNから取得されます。

TL; DR page_initに動的コントロールを作成する関数を呼び出すと、ページのポストバック時にユーザーが入力したすべての値を確認できるはずです。

この問題に関するいくつかのリンク:

http://forums.asp.net/t/1186195.aspx/1

ASP.NET-Page_Pre_init()またはPage_Init()またはPage_Load()で作成された動的コントロール

オプション2:

注意する必要があります:コントロールがすべて一意のIDを持っていて、ポストバックごとにそれらを再作成することに興味がない場合は、いつでもリクエストオブジェクトでそれらを探すことができます。Request.Formは、フォームの一部であったすべてのコントロールの値を保持するNameValueCollectionであり、探しているものを検索するだけです。

于 2012-10-29T15:10:35.630 に答える