动态创建的按钮拒绝调用它的 onClick
Dynamically Created Button refuses to call it's onClick
因此,在使用网络表单时,我尝试创建一个页面,将 table 从 sql 服务器输出到 html table [=16] =].然后我尝试向将重定向到页面的列添加一个按钮。唯一的问题是,当我按下按钮时,什么也没有发生……我试过在 onclick 方法上设置断点,但它们从未达到。
num = ds.Tables[0].Rows.Count;
htmlTable.Append("<tr style='background-color:#bd0000; color: White;'><th>ID</th><th>Job #</th><th>Project</th><th>Completed By</th><th>Date Created</th><th></th></tr>");
if (!object.Equals(ds.Tables[0], null))
{
if (ds.Tables[0].Rows.Count > 0)
{
int MAX_VIEW = (ds.Tables[0].Rows.Count > 15) ? 15 : ds.Tables[0].Rows.Count;
for (int i = 0; i < MAX_VIEW; i++)
{
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Job_Number"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Project_Name"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CompletedBy"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["DateCreated"] + "</td>");
htmlTable.Append("<td width=\"10%\"><button class=\"astext\" name=\"Btn" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" id =\"" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" OnClick =\"btnEdit_Click\" runat=\"server\" >Edit</button> | Details</td>");
htmlTable.Append("</tr>");
}
htmlTable.Append("</table>");
DBDataPlaceHolder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = htmlTable.ToString() });
}
else
{
htmlTable.Append("<tr>");
htmlTable.Append("<td align='center' colspan='4'>There is no Record.</td>");
htmlTable.Append("</tr>");
}
}
}
protected void btnEdit_Click(object sender, EventArgs e)
{
String id = ((System.Web.UI.WebControls.Button)sender).ID;
Server.Transfer("CcpofDetails.aspx?ID=" + id);
}
}
当我检查实时表单中的按钮时,这就是我所看到的
<button class="astext" name="Btn10" id="10" onclick="btnEdit_Click" runat="server">Edit</button>
您没有将 corectl 按钮添加到网络表单。试试这个方法:
Button btnEdit = New Button();
btn.Edit.Click += btnEdit_Click;
frmMain.Controls.Add(btnSave)
也如this question所示。
我认为您的问题是因为 ASP.NET 不知道您创建了按钮。就其而言,您所做的只是向页面输出一些文本。
因此,当您 post 返回到服务器时,它不知道在您单击时需要在服务器端执行任何操作。
尝试将其创建为 object(System.Web.UI.WebControls.Button
)并将其添加到您页面的 Controls
collection。请注意,您必须在初始页面构建和 postback 上执行此操作:如果控件在 postback 后不存在,则连接到它的事件将不存在火。
让它出现在您的 table 中间可能需要您以其他方式进行 HTML table 创建,例如构建 WebControls Table
object 并将 that 添加到您的 Controls
collection.
我觉得你生成动态控件的方式很奇怪。这不是网络表单的工作方式。
要运行控件上的事件,必须先将其加载到服务器内存中。但是您只是填充了一些 html 文本,这些文本只能被浏览器理解,而不是 asp.net 引擎。
为了给你一个更好的主意,像这样创建你的按钮
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
AddControls();
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (ViewState["controsladded"] == null)
AddControls();
}
private void AddControls()
{
TextBox dynamictextbox = new TextBox();
dynamictextbox.Text = "(Enter some text)";
dynamictextbox.ID = "dynamictextbox";
Button dynamicbutton = new Button();
dynamicbutton.Click += new System.EventHandler(dynamicbutton_Click);
dynamicbutton.Text = "Dynamic Button";
Panel1.Controls.Add(dynamictextbox);
Panel1.Controls.Add(new LiteralControl("<BR>"));
Panel1.Controls.Add(new LiteralControl("<BR>"));
Panel1.Controls.Add(dynamicbutton);
ViewState["controlsadded"] = true;
}
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
TextBox tb = new TextBox();
tb = (TextBox) (Panel1.FindControl("dynamictextbox"));
Label1.Text = tb.Text;
}
因此,在使用网络表单时,我尝试创建一个页面,将 table 从 sql 服务器输出到 html table [=16] =].然后我尝试向将重定向到页面的列添加一个按钮。唯一的问题是,当我按下按钮时,什么也没有发生……我试过在 onclick 方法上设置断点,但它们从未达到。
num = ds.Tables[0].Rows.Count;
htmlTable.Append("<tr style='background-color:#bd0000; color: White;'><th>ID</th><th>Job #</th><th>Project</th><th>Completed By</th><th>Date Created</th><th></th></tr>");
if (!object.Equals(ds.Tables[0], null))
{
if (ds.Tables[0].Rows.Count > 0)
{
int MAX_VIEW = (ds.Tables[0].Rows.Count > 15) ? 15 : ds.Tables[0].Rows.Count;
for (int i = 0; i < MAX_VIEW; i++)
{
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Job_Number"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Project_Name"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CompletedBy"] + "</td>");
htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["DateCreated"] + "</td>");
htmlTable.Append("<td width=\"10%\"><button class=\"astext\" name=\"Btn" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" id =\"" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" OnClick =\"btnEdit_Click\" runat=\"server\" >Edit</button> | Details</td>");
htmlTable.Append("</tr>");
}
htmlTable.Append("</table>");
DBDataPlaceHolder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = htmlTable.ToString() });
}
else
{
htmlTable.Append("<tr>");
htmlTable.Append("<td align='center' colspan='4'>There is no Record.</td>");
htmlTable.Append("</tr>");
}
}
}
protected void btnEdit_Click(object sender, EventArgs e)
{
String id = ((System.Web.UI.WebControls.Button)sender).ID;
Server.Transfer("CcpofDetails.aspx?ID=" + id);
}
}
当我检查实时表单中的按钮时,这就是我所看到的
<button class="astext" name="Btn10" id="10" onclick="btnEdit_Click" runat="server">Edit</button>
您没有将 corectl 按钮添加到网络表单。试试这个方法:
Button btnEdit = New Button();
btn.Edit.Click += btnEdit_Click;
frmMain.Controls.Add(btnSave)
也如this question所示。
我认为您的问题是因为 ASP.NET 不知道您创建了按钮。就其而言,您所做的只是向页面输出一些文本。
因此,当您 post 返回到服务器时,它不知道在您单击时需要在服务器端执行任何操作。
尝试将其创建为 object(System.Web.UI.WebControls.Button
)并将其添加到您页面的 Controls
collection。请注意,您必须在初始页面构建和 postback 上执行此操作:如果控件在 postback 后不存在,则连接到它的事件将不存在火。
让它出现在您的 table 中间可能需要您以其他方式进行 HTML table 创建,例如构建 WebControls Table
object 并将 that 添加到您的 Controls
collection.
我觉得你生成动态控件的方式很奇怪。这不是网络表单的工作方式。
要运行控件上的事件,必须先将其加载到服务器内存中。但是您只是填充了一些 html 文本,这些文本只能被浏览器理解,而不是 asp.net 引擎。
为了给你一个更好的主意,像这样创建你的按钮
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
AddControls();
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (ViewState["controsladded"] == null)
AddControls();
}
private void AddControls()
{
TextBox dynamictextbox = new TextBox();
dynamictextbox.Text = "(Enter some text)";
dynamictextbox.ID = "dynamictextbox";
Button dynamicbutton = new Button();
dynamicbutton.Click += new System.EventHandler(dynamicbutton_Click);
dynamicbutton.Text = "Dynamic Button";
Panel1.Controls.Add(dynamictextbox);
Panel1.Controls.Add(new LiteralControl("<BR>"));
Panel1.Controls.Add(new LiteralControl("<BR>"));
Panel1.Controls.Add(dynamicbutton);
ViewState["controlsadded"] = true;
}
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
TextBox tb = new TextBox();
tb = (TextBox) (Panel1.FindControl("dynamictextbox"));
Label1.Text = tb.Text;
}