1

イベントが発生したときにLabelandを作成することになっています。TextBoxCheckBoxListSelectedIndexChanged

次のコードで試しましたが、このエラーが発生しています。

同じ ID 'mylab1' を持つ複数のコントロールが見つかりました

protected void chkCar_SelectedIndexChanged(object sender, EventArgs e)
{
    // Panel2.Controls.Clear();
    string dat = DateTime.Parse(GridView1.SelectedRow.Cells[4].Text).ToString("dd-MMM-yyyy");
    lblName.Text = "";
    for (int i = 0; i < chkCar.Items.Count; i++)
    {
        int sum = 0;
        if (chkCar.Items[i].Selected == true)
        {
            Panel tt = new Panel();
            Panel2.Controls.Add(new LiteralControl("<br />"));
            Label mylab = new Label();
            mylab.ID = "mylab" + NextID1;
            mylab.Text = "No of Persons in " + chkCar.Items[i].Value;
            Panel2.Controls.Add(mylab);
            ControlsList1.Add(mylab.ID);

            TextBox mytext = new TextBox();
            mytext.ID = "mytext" + NextID2;
            mytext.Text = "";
            Panel2.Controls.Add(mytext);
            ControlsList2.Add(mytext.ID);
        }
    }
}

protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);
    foreach (string lbID in ControlsList1)
    {
        Label lb = new Label();
        lb.ID = lbID;
        Panel2.Controls.Add(lb);
        Panel2.Controls.Add(new LiteralControl("<br>"));
    }
    foreach (string txtID in ControlsList2)
    {
        TextBox tb = new TextBox();
        tb.ID = txtID;
        Panel2.Controls.Add(tb);
        Panel2.Controls.Add(new LiteralControl("<br>"));
    }
}

private List<string> ControlsList1 //labels
{
    get
    {
        if (ViewState["controls"] == null)
        {
            ViewState["controls"] = new List<string>();
        }
        return (List<string>)ViewState["controls"];
    }                     
}

private List<string> ControlsList2 //textboxes
{
    get
    {
        if (ViewState["controls"] == null)
        {
            ViewState["controls"] = new List<string>();
        }
        return (List<string>)ViewState["controls"];
    }
}

private int NextID1//label
{
    get
    {
        return ControlsList1.Count + 1;
    }
}

private int NextID2//textbox
{
    get
    {
        return ControlsList2.Count + 1;
    }
}

私がどこで間違っているのかを知るのを手伝ってくれる人はいますか? 前もって感謝します。

4

3 に答える 3

1

その作業を行うには、新しく追加したコントロール ID をControlsList1andに追加する必要があると思いますControlsList2。そうしないと、 NextID1andはループNextID2中に常に同じ番号を返します。for

if (chkCar.Items[i].Selected == true)
{
    Panel tt = new Panel();
    Panel2.Controls.Add(new LiteralControl("<br />"));
    Label mylab = new Label();
    mylab.ID = "mylab" + NextID1;
    mylab.Text = "No of Persons in " + chkCar.Items[i].Value;
    Panel2.Controls.Add(mylab);
    ControlsList1.Add(mylab.ID) // <--- here

    TextBox mytext = new TextBox();
    mytext.ID = "mytext" + NextID2;
    mytext.Text = "";
    Panel2.Controls.Add(mytext);
    ControlsList2.Add(mytext.ID) // <--- and here
}
于 2013-07-25T12:02:14.710 に答える
1

ViewStateチェックボックスイベントを発生させるたびに、コントロールをロードしてクリアしないようにしてください。ところでなんでロードしてんのViewState?そして、ViewStateすでにコントロールをロードしている場合、チェックボックスは再びパネルにコントロールをロードしようとします。

それがうまくいくことを願っています。

于 2013-07-25T13:00:49.727 に答える
0

問題は、NextID1増分IDを生成しているメソッドにあり、一意の番号を提供していません。ループ変数を使用して ID を一意にすることができます。ControlsList1メソッド NextID1 がコントロールを追加するたびに次の番号を与えるようにコントロールを追加するためのコードは見当たりませんControlsList1

private int NextID1//label
{
    get
    {
        return ControlsList1.Count + 1;
    }
}

また、配置(割り当て)ControlsList1していませんViewState

于 2013-07-25T12:00:20.437 に答える