【问题标题】:Set Server Side OnClick() event Programmatically以编程方式设置服务器端 OnClick() 事件
【发布时间】:2012-06-29 23:16:53
【问题描述】:

我正在寻找一种以编程方式为 TableCell 对象设置 OnClick 事件处理程序的方法。我正在尝试做的 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 函数工作。我正在寻找一种将 .cs CodeBehind 中定义的服务器端 clickHandler() 函数链接到此表格单元格的方法。

经过一下午的搜索,我一直无法想出一个可行的解决方案。提前感谢您的帮助。

【问题讨论】:

    标签: onclick code-behind tablecell


    【解决方案1】:

    经过大量的工作和研究,我能够拼凑出一个可行的解决方案,但对于应该已经内置的东西来说,这似乎是一项非常艰巨的工作。我所做的是扩展 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 方法似乎是多余的。如果有人有任何其他想法或任何方法来清理或使上述代码合法化,请告诉我。

    【讨论】:

      【解决方案2】:

      我不知道这是否与您的问题有关,但我试图将服务器端函数添加到 LinkBut​​ton 并找到以下 (VB) 代码:AddHandler cell.Click, AddressOf clickHandler,这对我有用。

      根据this code conversion service,这在C#中转换为cell.Click += clickHandler;

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多