如何在动态创建的ASP.net控件中动态创建ASP.net控件

我正在使用ASP.net进行申请。 我有一个按钮,点击时会生成一些html,一些asp文本框和一个asp按钮(第二个按钮)。 据我所知,这很好用。 现在我想要的是,当我点击第二个新创建的按钮时,我希望它创建一些html + 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("
")); pnlArea.Controls.Add(new LiteralControl("
")); pnlArea.Controls.Add(new LiteralControl("

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("
")); pnlArea.Controls.Add(new LiteralControl("
")); pnlArea.Controls.Add(new LiteralControl("

")); pnlArea.Controls.Add(new LiteralControl("
")); //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("
")); 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("
")); pnlArea.Controls.Add(new LiteralControl("
")); } private void createHazard (int hazardCount, int placeholderID) { //The starting of the HTML rows, etc FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("
")); FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("
")); 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("
")); FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("
")); 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("
")); FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("
")); 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("
")); FindControl("phHazard" + placeholderID).Controls.Add(new LiteralControl("
")); 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("
")); } }

}

这是一个连续向页面添加按钮的示例。 每个新创建的按钮也可以向页面添加另一个按钮。 这可以与所有类型的控件一起使用。 此外,您还必须在每个PostBack上重新创建动态控件,否则它们及其内容将丢失。

 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 = "
"; //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(); }