如何强制对在代码隐藏中创建并显示在 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因为当我单击没有错误的新按钮时,函数不会触发。 ?????

如何强制对在代码隐藏中创建并显示在 UpdatePanel 中的按钮进行完全回发

由于您的 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()' />";