关于事件委托!!!

i169net1 2006-08-21 03:18:07
http://community.csdn.net/Expert/topic/4811/4811871.xml?temp=.8033869

在用户控件中有两个按钮,一个‘提交’,另一个‘取消’...
在点击这个‘提交’后,用户控件完成一些自身的操作,但却无法对调用它的父页面进行操作,比如:提交后,把父页面上的Lable显示为另外一个文本。
(就算可以做到这点,但用户控件永远无法预知父页面的具体情况,比如这个Lable的ID会是什么?)

我用了事件委托(不知道这个算不算是...):
-------用户控件.cs--------
private static readonly object EventClick1;
protected System.Web.UI.WebControls.Button Button1;
private static readonly object EventClick2;
protected System.Web.UI.WebControls.Button Button2;

public event EventHandler Click1 //‘提交’
{
add
{
base.Events.AddHandler(WebUserControl1.EventClick1,value);
}
remove
{
base.Events.RemoveHandler(WebUserControl1.EventClick1,value);
}
}

public event EventHandler Click2 //‘取消’
{
add
{
base.Events.AddHandler(WebUserControl1.EventClick2,value);
}
remove
{
base.Events.RemoveHandler(WebUserControl1.EventClick2,value);
}
}

private void Button1_Click(object sender, System.EventArgs e) //‘提交’事件函数
{
//.....某些操作......//
EventHandler handler1 = (EventHandler) base.Events[EventClick];
if(handler1!=null)
{
handler1(this,e);
}
}

private void Button2_Click(object sender, System.EventArgs e) //‘取消’事件函数
{
//.....某些操作......//
EventHandler handler2 = (EventHandler) base.Events[EventClick2];
if(handler2!=null)
{
handler2(this,e);
}
}

-------父页面.cs--------
1、在Page_Load事件中加 (不进行IsPostBack属性的检测):
用户控件的类名 wb = (用户控件的类名)Page.FindControl("myeditc"); //用户控件
if(wb!=null)
{
wb.Click+=new EventHandler(wb_Click);
wb.Click2+=new EventHandler(wb_Click2);
}
2、写这两个事件函数:
private void wb_Click(object sender, EventArgs e) //提交
{
this.Page.Response.Write("<script>alert('您选择了确定!');</script>");
//再做一些别的什么...
}
private void wb_Click2(object sender, EventArgs e) //取消
{
this.Page.Response.Write("<script>alert('您选择了取消!');</script>");
//再做一些别的什么...
}

===============================================

测试后,发现:
不管是点‘提交’还是‘取消’,两个事件函数都被执行过...
先提示:“您选择了确定!”
接着又提示:“您选择了取消!”
其他没问题...

不知道应该怎么让它们各自执行各的事件?
望高人请教!!!
谢谢!!!

...全文
334 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
i169net1 2006-08-21
  • 打赏
  • 举报
回复
谢谢各位的帮助...

明天上班后再试了。

scow 2006-08-21
  • 打赏
  • 举报
回复
myeditc声明在前台页面啊,
<%@ Register Src="~/Module/user.ascx" TagName="b" TagPrefix="a" %>
<a:b ID="myeditc" runat="server" />
lindping 2006-08-21
  • 打赏
  • 举报
回复
其实有一个简单的办法
在引用页面 重写一下RaisePostBackEvent方法,


protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{


base.RaisePostBackEvent (sourceControl, eventArgument);
{
// 这里加入 你要执行的代码 其中sourceControl就是被点击引发回传的按钮
if(((Button)sourceControl).Text=="确定")
....
else
.....

}
}
listhome 2006-08-21
  • 打赏
  • 举报
回复
不知道楼主写的什么

好好看看这个文章
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/btparserint.mspx?mfr=true
hzw66 2006-08-21
  • 打赏
  • 举报
回复
没必要那么复杂的:
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;
public delegate void MyDelegate(Object o,System.EventArgs e);
public MyDelegate md1;
public MyDelegate md2;
private void Button1_Click(object sender, System.EventArgs e) //‘提交’事件函数
{
md1(sender,e);
}
private void Button2_Click(object sender, System.EventArgs e) //‘取消’事件函数
{
md2(sender,e);
}

父页面:
private void Page_Load(object sender, System.EventArgs e)
{
MyWC wb = (MyWC)Page.FindControl("myeditc"); //用户控件
if(wb!=null)
{
wb.md1 += new MyWC.MyDelegate(wb_Click1);
wb.md2 += new MyWC.MyDelegate(wb_Click2);
}
}
private void wb_Click1(object sender, EventArgs e) //提交
{
this.Page.Response.Write("<script>alert('您选择了确定!');</script>");
}
private void wb_Click2(object sender, EventArgs e) //取消
{
this.Page.Response.Write("<script>alert('您选择了取消!');</script>");
}
C5662601 2006-08-21
  • 打赏
  • 举报
回复
设断点跟踪一下吧
i169net1 2006-08-21
  • 打赏
  • 举报
回复
我这里测试还是不行...

如果只:
myeditc.Click+=new EventHandler(wb_Click);
myeditc.Click2+=new EventHandler(wb_Click2);
编译时会报错:无法找到myeditc这个类名...

如果加上myeditc的申明:
protected 用户控件的类名 myeditc;
再运行上面两行代码,结果还是一样,两个事件一起执行.........

scow 2006-08-21
  • 打赏
  • 举报
回复
试了一下,
用户控件的类名 wb = (用户控件的类名)Page.FindControl("myeditc"); //用户控件
if(wb!=null)
{
wb.Click+=new EventHandler(wb_Click);
wb.Click2+=new EventHandler(wb_Click2);
}
这里,改为

myeditc.Click+=new EventHandler(wb_Click);
myeditc.Click2+=new EventHandler(wb_Click2);

没有问题,是各自执行的
i169net1 2006-08-21
  • 打赏
  • 举报
回复
不懂您的意思,能说的详细些吗?
卧_槽 2006-08-21
  • 打赏
  • 举报
回复
调试以下pageload,你会发现有问题的。
阿牛138588 2006-08-21
  • 打赏
  • 举报
回复
偶还菜,偶在学习...

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧