Установить событие OnClick () на стороне сервера программно - PullRequest
1 голос
/ 17 апреля 2010

Я ищу способ программно установить обработчик события OnClick для объекта TableCell. ASP-эквивалент того, что я пытаюсь сделать, будет выглядеть так:

<asp:TableCell OnClick="clickHandler" runat="server">Click Me!</asp:TableCell>

В приведенном выше примере «clickHandler» - это функция на стороне сервера, определенная в .cs CodeBehind.

public virtual void clickHandler(object sender, EventArgs args) {...}

Однако, в моей ситуации, этот объект TableCell должен создаваться динамически, поэтому установка его в тег ASP не является опцией. Я пытаюсь сделать что-то вроде следующего в CodeBehind:

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
System.Web.UI.WebControls.TableCell cell = new System.Web.UI.WebControls.TableCell();
cell.Text = "Click Me!";
cell.Attributes.Add("onClick", "clickHandler");
row.Cells.Add(cell);

К сожалению, в этой ситуации:

cell.Attributes.Add("onClick", "clickHandler");

"clickHandler" работает только как функция javascript на стороне клиента. Я ищу способ связать серверную функцию clickHandler (), определенную в .cs CodeBehind, с этой ячейкой таблицы.

После полудня поиска я не смог найти рабочее решение. Заранее спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 19 апреля 2010

После большой работы и исследований я смог собрать рабочее решение, но кажется, что работа над чем-то, что уже встроено, требует огромных усилий. Что я сделал, так это расширил объект System.Web.UI.WebControls.TableCell, включив в него дескриптор события OnClick:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyWebApp
{


    public class ExpandableTableCell : TableCell, IPostBackEventHandler, INamingContainer
    {
        private static readonly object click_event = new object();

        public ExpandableTableCell()
        {
        }

        // public handles for adding and removing functions to be called on the click event
        public event EventHandler Click
        {
            add
            {
                Events.AddHandler(click_event, value);
            }
            remove
            {
                Events.RemoveHandler(click_event, value);
            }
        }

        // define parent function that will be called when the container is clicked
        protected void Click(EventArgs e)
        {
            EventHandler h = Events[click_event] as EventHandler;
            if (h != null)
            {
                h(this, e);
            }
        }

        // specify the "post back event reference" or id of the click event
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, 
                                Page.ClientScript.GetPostBackEventReference(this, "custom_click"));
        }

        // link the custom click id to the click function
        void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
        {
            if(eventArgument == "custom_click")
            {
                this.OnClick(EventArgs.Empty);
            }
        }
    }
}

Вот как я использую свой новый класс (почти так же, как стандартный TableCell):

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
ExpandableTableCell click_cell = new ExpandableTableCell();
click_cell.Text = "Click Me!";
click_cell.Click += clickHandler;
// extra little touch for mouseover event
click_cell.Attributes.Add("onmouseover", "this.style.cursor='pointer'");
row.Cells.Add(click_cell);

Как я уже сказал, похоже, что проблема расширения класса для установки метода OnClick в codebehind кажется чрезмерной. Если у кого-то есть какие-либо идеи или способы убрать или узаконить приведенный выше код, пожалуйста, сообщите мне.

0 голосов
/ 29 июня 2012

Я не знаю, относится ли это к вашей проблеме, но я пытался добавить серверную функцию в LinkButton и нашел следующий (VB) код: AddHandler cell.Click, AddressOf clickHandler, который работал для меня.

Согласно этой службе преобразования кодов , это переводится как cell.Click += clickHandler; в C #.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...