0

私のコード ビハインド (c#) ファイルは、while() ループを使用して、データベース内の任意の数の質問に対して RadioButtonLists を動的に宣言します。

for ループで各 tmpRBL にアイテムを追加します。

各 RadioButtonList を、while() ループの各反復の開始時に作成する子パネルに登録します。

次に、各パネルを親パネルに追加します。

while(reader.Read()
{ 
    ...

    RadioButtonList tmpRBL = new RadioButtonList();
    temp = "RadioButtonList" + count.ToString();
    tmpRBL.ID = temp;
    tmpRBL.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Vertical;
    tmpRBL.TextAlign = System.Web.UI.WebControls.TextAlign.Left;

    ...

    for (int i = 1; i <= numAnswers; i++)
    {
        tmpItem = new ListItem("", i.ToString());
        tmpRBL.Items.Add(tmpItem);
    }

    ...

    p.Controls.Add(tmpRBL);

    ...

    questionPanel.Controls.Add(p);

}

これらの動的に作成された RadioButtonLists の selectedIndexes を取得するにはどうすればよいですか? 他の同様の質問からオンラインでさまざまな修正を試みることに一日の大半を費やしましたが、うまくいきませんでした。

Chrome で「Inspect Element」を使用すると、割り当てた ID (RadioButtonList1、RadioButtonList2 など) を使用して目的の場所に RadioButtonLists を表向きに表示できますが、試みたすべてが null オブジェクトで終了します。

私は C# に比較的慣れておらず、動的コントロールを扱うのはこれが初めてです。

4

2 に答える 2

3

基本的に、コントロールを動的に作成する場合、ページのすべてのポストバックでそれらのコントロールを (同じ idで)リロードする必要があります。

そうしないと、それらは null になり、アクセスできなくなります。

これがサンプルです。コントロールを動的にロードRadioButtonListし、ボタンがクリックされたときに選択された値を表示します。

<asp:PlaceHolder runat="server" ID="PlaceHolder1"/>
<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" Text="Submit" />
<asp:Label runat="server" ID="Label1"/>

protected void Page_Load(object sender, EventArgs e)
{
    LoadControls();
}

protected void Button1_Click(object sender, EventArgs e)
{
    var radioButtonList = PlaceHolder1.FindControl("1") as RadioButtonList;
    Label1.Text = radioButtonList.SelectedValue;
}

private void LoadControls()
{
    var tmpRBL = new RadioButtonList();
    tmpRBL.ID = "1";

    for (int i = 1; i <= 5; i++)
    {
        var tmpItem = new ListItem(i.ToString(), i.ToString());
        tmpRBL.Items.Add(tmpItem);
    }

    PlaceHolder1.Controls.Add(tmpRBL);
}
于 2013-05-23T21:13:08.207 に答える