Добавление события click к динамической кнопке, отображаемой через литерал

У меня есть динамическая кнопка, которая отображается через 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 для кнопки в методе загрузки страницы, но, похоже, не регистрируется, когда я назначаю ее динамически создаваемой кнопке, отображаемой с помощью литерала.

Кто-нибудь знает почему? И есть ли простое решение этой проблемы? Заранее спасибо.

2 ответа

Решение

Вы можете визуализировать элемент управления как литерал. Тем не менее, никакое событие не будет прикреплено к этим элементам управления. Другими словами, событие click не будет вызываться, когда кнопка отправляется обратно на сервер.

Вы хотите добавить элемент управления в качестве элемента управления, используя PlaceHolder или Panel.

Хитрость в том, что вам нужно перезагрузить динамический элемент управления обратно в Page_Init с тем же идентификатором. В противном случае они станут нулевыми, и событие не будет запущено.

Вот пример -

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>

Это происходит потому, что вы не восстанавливаете контроль над Load для события, чтобы связать. Вам необходимо кэшировать достаточно информации, чтобы перестроить элемент управления под нагрузкой и добавить его в иерархию элементов управления, к которой он принадлежит, чтобы событие могло быть связано и запущено.

Другие вопросы по тегам