2

我有一个通过 ASP:Literal 呈现的动态按钮

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);

Button btnOpenFile = new Button();
btnOpenFile.ID = "BtnOpenFile-" + additionalReadingFileID;
btnOpenFile.Text = "Open";
btnOpenFile.CssClass = "SettingsChangeButton";
btnOpenFile.Click += new EventHandler(OpenFileInLocation);
btnOpenFile.RenderControl(writer);

writer.Close();
sw.Close();
this.LitAdditionalReadingContent.Text = sb.ToString();

添加到点击事件的方法是

protected void OpenFileInLocation(object sender, EventArgs e)
{
    //  Change Selected ID to this one
    Button clickedLink = (Button)sender;
    int fileID = Convert.ToInt32(clickedLink.ID.Replace("BtnOpenFile", ""));

    IRPBestPracticeTopicAdditionalReadingFile myOpenFile = new IRPBestPracticeTopicAdditionalReadingFile(fileID);
    System.Diagnostics.Process.Start(@myOpenFile.FilePath);
 }

这在我在 ASP 页面上添加一个按钮并将单击事件分配给页面加载方法上的按钮时有效,但是当我将它分配给通过文字呈现的动态创建的按钮时似乎没有注册。

有谁知道为什么?这个问题有简单的解决方案吗? 提前致谢。

4

2 回答 2

0

发生这种情况是因为您没有重建控件Load以使事件绑定。您需要缓存足够的信息以在加载时重建控件并将其添加到它所属的控件层次结构中,以便可以绑定和触发事件。

于 2013-12-18T16:28:25.010 回答
0

您可以将控件呈现为文字。但是,不会将任何事件附加到这些控件。换句话说,当按钮回传到服务器时,不会触发 click 事件。

您想使用PlaceHolderPanel将控件添加为控件。

诀窍是您需要使用相同的 ID 在 Page_Init 中重新加载那些动态控件。否则,它们将变为 null,并且不会触发事件。

这是一个例子 -

protected void Page_Init(object sender, EventArgs e)
{
    var btnOpenFile = new Button
    {
        ID = "BtnOpenFile-" + 1, 
        Text = "Open", 
        CssClass = "SettingsChangeButton"
    };
    btnOpenFile.Click += OpenFileInLocation;
    PlaceHolder1.Controls.Add(btnOpenFile);
}

ASPX

<%@ Page Language="C#" ... %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form id="form1" runat="server">
        <asp:PlaceHolder runat="server" ID="PlaceHolder1" />
    </form>
</body>

于 2013-12-18T16:38:02.500 回答