2017-03-02 170 views
2

我正在用ASP.net创建应用程序。我有一个按钮,点击时会生成一些html,一些asp文本框和一个asp按钮(第二个按钮)。这可以正常工作,据我所知。现在我想要的是,当我点击那个新创建的按钮时,我希望它创建一些html + asp.net文本框。如何在动态创建的ASP.net控件中动态创建ASP.net控件

这似乎让我感到困惑,有没有更简单的方法来做到这一点?我似乎无法弄清楚,我在按钮2的onclick事件上创建,但它尚未存在。

非常感谢。

认为它可能更容易看到代码,以防万一你想看看发生了什么。

namespace ConnorMackayWebForm 
{ 
public partial class InspectionCreate : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Set the initial amount of areas and hazards 
     int areaCount = 0; 
     int hazardCount = 0; 

     //Check if the viewstate with the area count already exists 
     if (ViewState["areaCount"] != null) 
     { 
      //Convert the view state back to an int 
      areaCount = Convert.ToInt32(ViewState["areaCount"]); 
     } 
     else 
     { 
      ViewState["areaCount"] = areaCount; 
     } 

     //Check if the viewstate with the hazard count already exists 
     if (ViewState["hazardCount"] != null) 
     { 
      //Convert the view state back to an int 
      hazardCount = Convert.ToInt32(ViewState["hazardCount"]); 
     } 
     else 
     { 
      ViewState["hazardCount"] = hazardCount; 
     } 

     //Create the required number of areas 
     for (int i = 1; i <= areaCount; i++) 
     { 
      createArea(i); 
     } 

     //Create the required number of hazards 
     for (int i = 1; i <= hazardCount; i++) 
     { 
      createHazard(i); 
     } 
    } 

    protected void btnCreateArea_Click(object sender, EventArgs e) 
    { 
     //Get the current number of areas 
     int areaCount = Convert.ToInt32(ViewState["areaCount"]) + 1; 

     //Create the area 
     createArea(areaCount); 

     //Set the new area into the viewstate 
     ViewState["areaCount"] = areaCount; 
    } 

    protected void btnCreateHazard_Click(object sender, CommandEventArgs areaCount) 
    { 
     //Get the current number of areas 
     int hazardCount = Convert.ToInt32(ViewState["hazardCount"]) + 1; 

     //Get the argument from the button 
     int placeholderID = Convert.ToInt32(areaCount.CommandArgument); 

     //Create the hazard 
     createHazard(hazardCount, placeholderID); 

     //Set the new hazard into the viewstate 
     ViewState["hazardCount"] = hazardCount; 
    } 

    private void createArea(int areaCount) 
    { 
     //Start generating the HTML 
     pnlArea.Controls.Add(new LiteralControl("<div class='box'>")); 
     pnlArea.Controls.Add(new LiteralControl("<div class='box-header with-border'>")); 
     pnlArea.Controls.Add(new LiteralControl("<h2 class='box-title'>Area/Equipment Inspected 1: ")); 

     //Create the title dropdown 
     DropDownList ddArea = new DropDownList(); 
     ddArea.ID = "ddArea" + areaCount; 

     pnlArea.Controls.Add(ddArea); 

     //Create the Other textbox in the title 
     pnlArea.Controls.Add(new LiteralControl(" Other: ")); 

     TextBox txtOther = new TextBox(); 
     txtOther.ID = "txtOther" + areaCount; 

     pnlArea.Controls.Add(txtOther); 

     //Generate HTML for the box body and begining of first column 
     pnlArea.Controls.Add(new LiteralControl("<div class='box-tools pull-right'>")); 
     pnlArea.Controls.Add(new LiteralControl("</div>")); 
     pnlArea.Controls.Add(new LiteralControl("</div>")); 
     pnlArea.Controls.Add(new LiteralControl("<div class='box-body'>")); 

     //Placeholder to put future hazards into 
     PlaceHolder phHazard = new PlaceHolder(); 
     phHazard.ID = "phHazard" + areaCount; 

     pnlArea.Controls.Add(phHazard); 

     //Create hazard button 
     pnlArea.Controls.Add(new LiteralControl("<br>")); 

     Button btnCreateHazard = new Button(); 
     //btnCreateHazard.Click += btnCreateHazard_Click; 
     btnCreateHazard.ID = "btnCreateHazard" + areaCount; 
     btnCreateHazard.Text = "Create Hazard"; 
     btnCreateHazard.CssClass = "form-control"; 

     //Pass along the current area count, allowing the onclick to pick it up, pass it to 
     //the create hazard method. That method will then take the argument and search for a place 
     //holder with matching ID and assign the controls to that placeholder. 
     btnCreateHazard.Command += btnCreateHazard_Click; 
     btnCreateHazard.CommandArgument = areaCount.ToString(); 

     pnlArea.Controls.Add(btnCreateHazard); 

     pnlArea.Controls.Add(new LiteralControl("</div>")); 
     pnlArea.Controls.Add(new LiteralControl("</div>")); 
    } 

    private void createHazard (int hazardCount, int placeholderID) 
    { 
     //The starting of the HTML rows, etc 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<div class='row'>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<div class='col-lg-3'>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("Hazard: ")); 

     //Create the Hazard Dropdown 
     DropDownList ddHazard = new DropDownList(); 
     ddHazard.ID = "ddHazard" + hazardCount; 

     FindControl("phHazard" + placeholderID).Controls.Add(ddHazard); 

     //HTML ending the first column, starting second 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("</div>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<div class='col-lg-3'>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("Hazard Description: ")); 

     //Create the hazard description textbox 
     TextBox txtHazardDesc = new TextBox(); 
     txtHazardDesc.ID = "txtHazardDesc" + hazardCount; 

     FindControl("phHazard" + placeholderID).Controls.Add(txtHazardDesc); 

     //HTML ending second column, starting third 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("</div>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<div class='col-lg-3'>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("Corrective Action Due Date: ")); 

     //Create the due date textbox 
     TextBox txtDueDate = new TextBox(); 
     txtDueDate.ID = "txtDueDate" + hazardCount; 

     FindControl("phHazard" + placeholderID).Controls.Add(txtDueDate); 

     //HTML ending the third column, starting fourth 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("</div>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<div class='col-lg-3'>")); 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("Corrective Action Description: ")); 

     //Create the corrective action description text box 
     TextBox txtActionDesc = new TextBox(); 
     txtActionDesc.ID = "txtActionDesc" + hazardCount; 

     FindControl("phHazard" + placeholderID).Controls.Add(txtActionDesc); 

     //End the row 
     FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("<br>")); 
    } 
} 

}

+1

请阅读[问]并分享您的代码。 – CodeCaster

回答

1

这里是连续地添加按钮的页面的示例。每个新创建的按钮还可以在页面上添加另一个按钮。这可以用于所有类型的控件。 此外,你将不得不重新创建每个回发的动态控制,否则他们和他们的内容将会丢失。

protected void Page_Load(object sender, EventArgs e) 
{ 
    //set the initial number of buttons 
    int buttonCount = 1; 

    //check if the viewstate with the buttoncount already exists (= postback) 
    if (ViewState["buttonCount"] != null) 
    { 
     //convert the viewstate back to an integer 
     buttonCount = Convert.ToInt32(ViewState["buttonCount"]); 
    } 
    else 
    { 
     ViewState["buttonCount"] = buttonCount; 
    } 

    //create the required number of buttons 
    for (int i = 1; i <= buttonCount; i++) 
    { 
     createButton(i); 
    } 
} 

private void createButton(int cnt) 
{ 
    //create a new butotn control 
    Button button = new Button(); 
    button.Text = "Add another Button (" + cnt + ")"; 

    //add the correct method to the button 
    button.Click += DynamicButton_Click; 

    //another control, in this case a literal 
    Literal literal = new Literal(); 
    literal.Text = "<br>"; 

    //add the button and literal to the placeholder 
    PlaceHolder1.Controls.Add(button); 
    PlaceHolder1.Controls.Add(literal); 
} 

protected void DynamicButton_Click(object sender, EventArgs e) 
{ 
    //get the current number of buttons 
    int buttonCount = Convert.ToInt32(ViewState["buttonCount"]) + 1; 

    //create another button 
    createButton(buttonCount); 

    //set the new button count into the viewstate 
    ViewState["buttonCount"] = buttonCount; 
} 

UPDATE

您也可以委派Command的按钮,而不是一个Click,以及与此您可以用按钮作为CommandArgument一起发送的变量。你将不得不改变一下按钮的创建。

//add the correct method to the button 
button.Command += DynamicButton_Command; 

//now you can also add an argument to the button 
button.CommandArgument = "Create Hazard"; 

您还需要一个不同的方法来处理按钮点击。

protected void DynamicButton_Command(object sender, CommandEventArgs e) 
{ 
    //get the current number of buttons 
    int buttonCount = Convert.ToInt32(ViewState["buttonCount"]) + 1; 

    //create another button 
    createButton(buttonCount); 

    //set the new button count into the viewstate 
    ViewState["buttonCount"] = buttonCount; 

    //get the commandargument from the button 
    string buttonArgument = e.CommandArgument.ToString(); 
} 
+0

非常感谢,我试了一下。 –

+0

嘿,我一直在玩你给我的代码,它的相当不错。我想知道,是否可以这样做,当我点击'Are/Equipment Inpected'框3或4中的“创建危险”按钮时,Hazard行出现在单击的相应文本框中?我会添加一张图片,希望能更好地解释。非常感谢您的指导。 https://i.gyazo.com/a63c828956415de1d83b1828a07c740f.png –

+0

是的,这是可能的。查看我的更新。您可以从'Click'切换到'Command'以随同按钮一起发送一个变量。 – VDWWD