0

データベースに と の 2 つのテーブルがQuestionありAnswersます。1 つの質問は、その性質として 1 つ以上の回答を取得します。回答テキストボックスを動的に追加しようとしていました。ユーザーは、希望する回答をいくつでも追加できます。これには div でパネルを使用しました。div1 は panel1 を取得し、div2 は panel2 を取得します。

パネルには、動的に追加した TextBoxes があり、txtAnswer1 や txtAnswer2 のような数値で ID を指定しました。送信ボタンを押すと、このtxtboxesをオンにして値を取得したいのですが、どうすればよいですか?

このリンクソリューションを試しましたが、できませんでした。

http://learning2code.net/Learn/2009/8/12/Adding-Controls-to-an-ASPNET-form-Dynamically.aspx

これはデザイン ビューです。

    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtCount" runat="server"></asp:TextBox>
        <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
    </div>
    <div style="border: medium solid #000000;">
        <asp:Panel ID="pnlAns" runat="server"></asp:Panel>
    </div>

    <div style="border: medium solid #000099;">
        <asp:Panel ID="pnlJ" runat="server"></asp:Panel>
    </div>
    <div style="border: medium solid #000000;">
        <asp:Panel ID="pnlA" runat="server"></asp:Panel>
    </div>
    <div>
        <asp:Button ID="btnGetValues" runat="server" Text="Get Values" OnClick="btnGetValues_Click" />
        <br />
        <asp:Label ID="lblValues" runat="server" />
    </div>
</form>

これは背後にあるコードです:

protected void btnAdd_Click(object sender, EventArgs e)
{
    int count = Convert.ToInt32(txtCount.Text);
    for (int i = 0; i < count; i++)
    {
        TextBox txt = new TextBox { ID = "txtAns" + i.ToString() };
        pnlAns.Controls.Add(txt);
        TextBox txtA = new TextBox { ID = "txtPoint" + i.ToString() };
        pnlA.Controls.Add(txtA);
        TextBox txtJ = new TextBox { ID = "txtOther" + i.ToString() };
        pnlJ.Controls.Add(txtJ);
    }
}

私のコード コントロールで入力を追加します。

ボタンクリックで入力値を取得したいと思います。

protected void btnGetValues_Click(object sender, EventArgs e)
{

}

私の質問はどうですか?

ご覧のとおり、3 つのパネルと 3 つの異なるテキスト ボックスがあります。それは私が見つけようとするところです。

パネル配列にパネルを追加しようとしましたが、まだテキストボックスの値を取得できません。:(

protected void btnGetValues_Click(object sender, EventArgs e)
{
    Panel[] pnls = new Panel[3] { pnlAns, pnlA, pnlJ };

    foreach (Panel pnlIn in pnls)
    {
        lblValues.Text = pnlIn.Controls.ToString();
    }
}

何が悪いのかわかりませんが、追加ボタンを押すとテキストボックスを追加できますが、それらは単なる html テキストボックスです。つまり、彼らはそう<input name="txtOther0" type="text" id="txtOther0" />です。コード例外処理を実行しようとすると、 foreach ループから追い出されます。入力にサーバータグがないと思います。これが問題の場合、どうすれば「runat="server"」にすることができますか?

テキストボックスの値ViewStateを追加する必要がありますか?

4

2 に答える 2

3

回答テキストボックスの周りにパネルを使用してみて、runat="server" があり、ID がわかっていることを確認してください。次に、そのパネルの子であるコントロールを調べて、コントロールのタイプが Textbox であるかどうかを確認できます。そうである場合は、テキスト プロパティから回答を取得します。

擬似コード:

panel pnl = findpanel("mypanel");
foreach (control ctrl in pnl.controls)
{
    if (ctrl is TextBox)
    {
        //get the text property value here
    }
}
于 2012-12-10T18:52:46.840 に答える
2

TextBox内に動的に追加された値を取得するには、 内のPanelすべてのTextBoxコントロールをループする必要がありますPanel

Control answerPanel = Page.FindControl("AnswerPanelID");
foreach( Control childControl in answerPanel.Controls )
{
    if( childControl is TextBox )
    {
        //Retrieve and store value from childControl.Text
    }
}

この方法を使用すると、個々の ID によるコントロールの取得について心配する必要がなくなります。特定の ID を持つコントロールを検索する場合は、Page.FindControl()メソッドを使用します。

編集した説明で:

コードを少し調整する必要があります。正しいパネル コントロールの配列をループします。間違っているのは、値を取得しようとしている方法です。

lblValues.Text = pnlIn.Controls.ToString()

動作しません。その代わりに、次のようにする必要があります。

protected void btnGetValues_Click(object sender, EventArgs e)
{
    Panel[] pnls = new Panel[3] { pnlAns, pnlA, pnlJ };
    ArrayList answers = new ArrayList();
    //Alternatively....
    System.Collections.Hashtable ht = new System.Collections.Hashtable();

    foreach (Panel pnlIn in pnls)
    {
        foreach( Control childControl in pnlIn.Controls )
        {
            if( childControl is TextBox )
            {
                TextBox box = (TextBox)childControl;
                //Retrieve and store value from childControl.Text
                answers.Add(box.Text);
                //Alternatively...
                ht.Add( box.ID, box.Text );
            }
        }
    }
}

最終的に、パネル内のすべてのテキスト ボックスの値でいっぱいになったArrayList(またはHashTableの ID でインデックス付けされた) が得られます。TextBoxパネルに質問と回答の両方がある場合、if ステートメントは、ID に「回答」が含まれているかどうかを確認する必要があります。

于 2012-12-10T18:59:49.930 に答える