如何强制对在代码隐藏中创建并显示在 UpdatePanel 中的按钮进行完全回发
本文关键字:按钮 显示 代码 何强制 隐藏 创建 UpdatePanel | 更新日期: 2023-09-27 18:34:57
我正在使用包含按钮 1 的 asp.net UpdatePanel。在 Button1 单击时,将在代码隐藏中创建一个字符串,然后发送回 updatePanel。该字符串包含应触发回发以执行Button2_Click函数的 Button2。不幸的是,我还没有能够在按钮 2 上执行完整的回发。
如果我将 Button2 添加为 aspx 页上的 UpdatePanel 中的 PostBackTrigger 控件,则会收到一条错误消息,指出找不到该控件 (Button2(。这是有道理的,因为 Buton2 是通过在代码隐藏中单击 Button1 创建的,并且在页面加载时不可用。
我正在尝试在页面加载时注册PostBackControl(Button2(,但再次出现错误,指出当前上下文中不存在Button2。
任何帮助将不胜感激。
ASPX 页
<asp:ScriptManager ID="ScriptManager" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<fieldset>
<div runat="server" id="DIV1">Testing...<br /></div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" clientidmode="static"/>
<div runat="server" id="DIV2"></div>
<asp:Label ID="DIV2_LABEL" runat="server"></asp:Label>
</fieldset>
</ContentTemplate>
代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.GetCurrent(Page).RegisterPostBackControl(Button2);
}
protected void Button1_Click(object sender, EventArgs e)
{
string DIV1_Html;
DIV1_Html= DIV1.InnerHtml;
DIV2.InnerHtml = DIV1_Html;
DIV2.InnerHtml += "<input id='Button2' type='button' value='button' runat='server' OnClick='Button2_Click' />";
}
protected void Button2_Click(object sender, EventArgs e)
{
DIV2_LABEL.Text = "Testing button2";
}
编辑
根据下面的建议,我添加了如下按钮:
而不是:
DIV2.InnerHtml += "<input id='Button2' type='button' value='button' runat='server' OnClick='Button2_Click' />";
我修改了代码如下:
Button Button2 = new Button();
Button2.Text = "Add";
Button2.Click += new EventHandler(Button2_Click);
PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = Button2.ID };
UpdatePanel1.Triggers.Add(pTrigger);
DIV2.Controls.Add(Button2);
但是我仍然缺少一些东西Button2_Click因为当我单击没有错误的新按钮时,函数不会触发。 ?????
由于您的 Button2 是在客户端创建的,因此 updatePanel1 无法识别其 ID。您可以像这样动态创建 Button2:
Button button2 = new Button();
PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = button2.ID };
updatePanel1.Triggers.Add(pTrigger);
DIV2.Controls.Add(button2);
更新:这里有一个小例子,你可以使用:
public partial class WebForm1 : System.Web.UI.Page
{
private bool ShowButton2()
{
return ViewState["createButton"] == null ? false : (bool)ViewState["createButton"];
}
protected void Page_Load(object sender, EventArgs e)
{
if (ShowButton2())
CreateButton();
}
void CreateButton()
{
Button Button2 = new Button();
Button2.Text = "Add";
Button2.ID = "button2";
Button2.Click += Button2_Click;
PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = Button2.ID };
updatePanel1.Triggers.Add(pTrigger);
DIV2.Controls.Add(Button2);
}
void Button2_Click(object sender, EventArgs e)
{
}
protected void button1_Click(object sender, EventArgs e)
{
if (!ShowButton2())
{
ViewState["createButton"] = true;
CreateButton();
}
}
}
视图状态当然是显示 Button2 的标志。
按钮上有一个名为OnClientClick的属性,您可以使用它来调用javascript,然后导航到您的页面。
例:
在您的 apsx 页面中
<script type="javascript">
function reloadPage() {
window.location.href = '...';
}
在代码隐藏中
DIV2.InnerHtml += "<input id='Button2' type='button' value='button' OnClick='ReloadPage()' />";