Динамический список кнопок в раскрывающемся списке dataBound выдает ошибку
Я хочу создать динамический список кнопок в раскрывающемся списке dataBound . Не в Init() или в конструкторе... Но каждый раз выдает ошибку...
Control 'ctl00' of type 'Button' must be placed inside a form tag with runat=server
Мой Dropdown уже внутри формы с runat="server"
это наценка:
<body>
<form id="form1" runat="server" style="height: 100%">
<asp:DropDownList runat="server" Width="100%" ID="ddlLecturer" OnSelectedIndexChanged="ddlLecturer_SelectedIndexChanged" AutoPostBack="true" OnDataBound="ddlLecturer_DataBound">
</asp:DropDownList>
</form>
</body>
это мой код:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//fill dropdown
}
protected void ddlLecturer_DataBound(object sender, EventArgs e)
{
//alternate --didnot work out
//List<Button> buttons = new List<Button>();
//for (int i = 0; i < 10; i++)
//{
// Button newButton = new Button();
// newButton.ID = "btn1";
// buttons.Add(newButton);
// this.Controls.Add(newButton);
//}
CreateDynamicButton();
}
private void CreateDynamicButton()
{
// Create a Button object
Button dynamicButton = new Button();
// Set Button properties
dynamicButton.Height = 40;
dynamicButton.Width = 300;
dynamicButton.BackColor = Color.Red;
dynamicButton.ForeColor = Color.Blue;
//dynamicButton.Location = new Point(20, 150);
dynamicButton.Text = "I am Dynamic Button";
//dynamicButton.Name = "DynamicButton";
//dynamicButton.Font = new Font("Georgia", 16);
//// Add a Button Click Event handler
//dynamicButton.Click += new EventHandler(DynamicButton_Click);
// Add Button to the Form. Placement of the Button
// will be based on the Location and Size of button
Controls.Add(dynamicButton);
}
}
Чего мне не хватает?
1 ответ
Ну, сообщение об ошибке говорит само за себя. Он не жалуется на ваш DropDownList, а жалуется на то, что динамическая кнопка не находится внутри формы.
Ты можешь использовать form1.Controls.Add(dynamicButton)
, Это обеспечит добавление элемента управления в <form></form>
теги.
Вы видите, есть еще один вариант Page.Controls.Add(dynamicButton)
но это не сработает и выдает то же сообщение об ошибке, что и элемент управления будет добавлен на странице, но вне <form></form>
теги.
Более чистым вариантом было бы иметь какой-либо заполнитель на стороне сервера в <form></form>
теги. Например <div runat="server" id="placeHolder></div>
Теперь вы сможете добавить элемент управления, используя placeHolder.Controls.Add(dynamicButton)
Дополнительная информация
Что касается добавления динамических элементов управления, вы должны знать, что элементы управления должны быть воссозданы при обратной передаче. Также жизненный цикл страницы ASP.NET имеет решающее значение.
Вот небольшой пример. Не самое чистое решение; но это для вас, чтобы понять.
Основываясь на выпадающем списке, создается динамическая кнопка. И когда вы нажимаете на динамическую кнопку, она отображает сообщение, относящееся к этой кнопке.
наценка
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="page1.aspx.cs" Inherits="test.page1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddlLecturer" runat="server" AutoPostBack="True"
onselectedindexchanged="ddlLecturer_SelectedIndexChanged">
<asp:ListItem>Select</asp:ListItem>
<asp:ListItem Value="1">Lecturer1</asp:ListItem>
<asp:ListItem Value="2">Lecturer2</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="lblOutput" runat="server" Text=""></asp:Label>
</div>
<div id="placeHolder" runat="server">
</div>
</form>
</body>
</html>
Код позади
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
namespace test
{
public partial class page1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["dynamicBtnSession"] != null)
{
CreateDynamicButton((string)Session["dynamicBtnSession"]);
}
}
protected void ddlLecturer_SelectedIndexChanged(object sender, EventArgs e)
{
placeHolder.Controls.Remove(FindControl("dynamicBtn"));
lblOutput.Text = string.Empty;
if (ddlLecturer.SelectedValue != "Select")
{
Session["dynamicBtnSession"] = ddlLecturer.SelectedValue;
CreateDynamicButton(ddlLecturer.SelectedValue);
}
else
{
Session["dynamicBtnSession"] = null;
}
}
private void CreateDynamicButton(string val)
{
Button btn = new Button();
btn.Height = 40;
btn.Width = 120;
btn.BackColor = Color.Gray;
btn.ForeColor = Color.Black;
btn.ID = "dynamicBtn";
btn.Text = "Dynamic Button " + val;
btn.Click += new EventHandler(btn_Click);
placeHolder.Controls.Add(btn);
}
void btn_Click(object sender, EventArgs e)
{
lblOutput.Text = "You clicked " + ((Button)sender).Text;
}
}
}