我正在寻找一种以编程方式为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()函数链接到此表格单元格的方法。
经过一个下午的搜索,我无法找到一个有效的解决方案。提前感谢您的帮助。
答案 0 :(得分:4)
经过大量的工作和研究,我能够拼凑出一个可行的解决方案,但对于应该已经内置的东西来说,这似乎是一项非常多的工作。我所做的是扩展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方法的麻烦。如果有人有任何其他想法或任何方法来清理或合法化上述代码,请告诉我。
答案 1 :(得分:0)
我不知道这是否与您的问题有关,但我试图将一个服务器端函数添加到LinkButton并找到以下(VB)代码:AddHandler cell.Click, AddressOf clickHandler
,这对我有用。
根据this code conversion service,这转换为C#中的cell.Click += clickHandler;
。
希望这有帮助!