我有一个动态按钮,通过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();
添加到click事件的方法是
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页面上添加一个按钮并将click事件分配给页面加载方法上的按钮时,这是有效的,但是当我将它分配给通过文字呈现的动态创建按钮时似乎没有注册。 / p>
有谁知道为什么?这个问题有一个简单的解决方案吗? 提前谢谢。
答案 0 :(得分:0)
这种情况正在发生,因为您没有重建 Load
上的控件以使事件受到约束。您需要将足够的信息缓存到重建加载控件,并将其添加到它所属的控件层次结构中,以便绑定和触发事件。
答案 1 :(得分:0)
您可以将控件渲染为文字。但是,这些控件不会附加任何事件。换句话说,当按钮回发到服务器时,不会触发click事件。
您想使用 PlaceHolder 或面板将控件添加为控件。
诀窍是你需要在具有相同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);
}
<%@ 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>