我有一个继承自UserControl
的控件。此控件上有一个LinkButton
LbButtonClick(object sender, EventArgs e)
方法。我只有一个用于此控件的ascx文件和一个预编译的程序集。
我需要用自己的自定义方法替换LbButtonClick
方法。这该怎么做?我可以在ascx文件中执行此操作,还是必须在第一次在网页上加载时修改控件。
如果有可能(ascx文件),我想使用第一个解决方案 - 让我的修改尽可能接近控件本身。
被修改
我想感谢@pid和@Francesco Milani的帮助。我正在考虑他们的解决方案,但在实施之前我只是尝试了一件事......简单地说,我已经在上述控件的ascx文件中添加了这段代码。
<script runat="server" type="text/C#">
protected void LbButtonClick(object sender, EventArgs e)
{
//Some code here...
}
</script>
它有效。似乎允许在ascx文件中重新定义方法,并且调用此重新定义的方法而不是在程序集中预编译的方法。我没有得到编译器的信息,没有警告或提示。很奇怪,我不明白。由于这比建议的解决方案更容易和更清洁,我会接受它作为答案,但我不想接受我自己的答案。
也许有人可以解释为什么上述结构有效?
答案 0 :(得分:0)
从未尝试过这个,但你应该能够从类派生,然后在表单中使用它。如果课程被密封......没有骰子!
另一种方法是将ASCX包装在您自己的周围,从原始ASCX中删除按钮(通过编辑其HTML),然后在您自己的位置添加一个按钮。单击您自己的按钮后,“手动”激活内部ASCX的单击事件:LbButtonClick(mySender, myArgs)
。
我很好奇这是如何运作的。请告诉我们您是如何解决这个问题的!
答案 1 :(得分:0)
看看这个。
testControl.acx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="testControl.ascx.cs" Inherits="TestWebApp.testControl" %>
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
和codebehind:
protected void Page_Load(object sender, EventArgs e)
{
this.LinkButton1.Click += LinkButton1_Click;
}
private void LinkButton1_Click(object sender, EventArgs e)
{
Response.Redirect("http://www.google.com");
}
在您的示例中,您无权访问LinkButton1_Click方法..所以
的Default.aspx
<%@ Register Src="~/testControl.ascx" TagPrefix="uc1" TagName="testControl" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:testControl runat="server" id="testControl" />
</div>
</form>
</body>
</html>
和codebehind:
protected void Page_Load(object sender, EventArgs e)
{
foreach (LinkButton lb in testControl.Controls)
{
if (lb.ID == "LinkButton1")
lb.Click += lb_Click;
}
}
private void lb_Click(object sender, EventArgs e)
{
Response.Redirect("http://www.microsoft.com");
}
因此,您将重定向到Microsoft而不是Google。 希望它有所帮助