0

ユーザーがテキストボックスを動的に追加できる Web フォームを作成しました。現在、ボタンをクリックして別のフィールドを追加すると、それ自体にポストバックします。コントロールは Pre_Init に追加されます。ただし、ページが再構築されると、テキストボックスの名前が毎回異なるため、ポストバックごとにデータが保持されません。

protected void Page_PreInit(object sender, EventArgs e)
{

    MasterPage master = this.Master; //had to do this so that controls could be added. 
    createNewTextField("initEnumValue",true);
    RecreateControls("enumValue", "newRow");
}
private int FindOccurence(string substr)
{
    string reqstr = Request.Form.ToString();

    return ((reqstr.Length - reqstr.Replace(substr, "").Length) / substr.Length);
}
private void RecreateControls(string ctrlPrefix, string ctrlType)
{
    string[] ctrls = Request.Form.ToString().Split('&');
    int cnt = FindOccurence(ctrlPrefix);
    //Response.Write(cnt.ToString() + "<br>");
    if (cnt > 0)
    {
        for (int k = 1; k <= cnt; k++)
        {
            for (int i = 0; i < ctrls.Length; i++)
            {
                if (ctrls[i].Contains(ctrlPrefix  + k.ToString()) && !ctrls[i].Contains("EVENTTARGET"))
                {
                    string ctrlID = ctrls[i].Split('=')[0];

                    if (ctrlType == "newRow")
                    {

                        createNewTextField(ctrlID,false);
                    }
                    break;
                }
            }
        }
    }
}
protected void addEnum_Click(object sender, ImageClickEventArgs e)
{

    int cnt = FindOccurence("enumValue");
    createNewTextField("enumValue" + Convert.ToString(cnt + 1),false);
   // Response.Write(cnt.ToString() + "<br>");
}
private void createNewTextField(string ID, bool button)
{
    Response.Write(ID + "<br/>"); //this is where I'm getting different names each time there is a postback
    if (ID != "initEnumValue") //create new line starting with the second tb. 
    {
        LiteralControl newLine = new LiteralControl();
        newLine.Text = "<br />";
        this.plhEnum.Controls.Add(newLine);
    }



    TextBox newTb = new TextBox();
    newTb.ID = ID;
    this.plhEnum.Controls.Add(newTb);

    if (button) //create the button only on the first one. 
    {
        LiteralControl space = new LiteralControl();
        space.Text = "&nbsp;";
        this.plhEnum.Controls.Add(space);
        ImageButton imgbutton = new ImageButton();
        imgbutton.ID = "addEnum";
        imgbutton.ImageUrl = "~/images/add.png";
        imgbutton.Click += new ImageClickEventHandler(addEnum_Click);
        imgbutton.CausesValidation = false;

        this.plhEnum.Controls.Add(imgbutton);
    }

    //endEnumRow();
    //this.plhEnum.Controls.Add(newTb);
}

このソリューションを試しました ASP .NET MVC で動的に生成されたコントロールからデータを取得するにはどうすればよいですか?

4

0 に答える 0