请问怎样可以实现页面和控件之间的“方法传参”

N_ccw 2007-01-24 05:03:40
需求如下:
做一个Web用户控件,控件中放有4个Button(假设的)
每个Button的的OnClick事件都需要调用使用该控件页面的一个方法A
因为使用该控件的页面的方法A的方法体不同,所以本人原意是想将每个页面的方法当作参数传递给控件初始化,然后在控件中调用它
本人曾用delegate当参数传递给控件,但以失败告终,用delegate传递方法时,第一次页面加载时可以调用,但是之后却没有想要的结果
请教各位牛人,这个问题要怎么解决,在下在这里先谢谢各位了
...全文
375 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
deepinnet 2008-12-20
  • 打赏
  • 举报
回复
在控件的页面上定义个事件 ,还得写个激化这个事件的函数,把这个事件的处理方法写在调用的页面上面,这样就分离了,那个页面调用这个控件,就在页面上写个对应的事件处理函数
facebookdotcom 2008-12-20
  • 打赏
  • 举报
回复
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
如果那位朋友有比较通用的方法,也可以介绍下
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
说白了,我就是想写一个通用的分页控件
xujunsweet 2007-01-25
  • 打赏
  • 举报
回复
webcontrol wb=(webcontrol)page.FindControl("webcontrol1")

webcontrol1是使用该控件页面上的控件名
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
我跟我的一个朋友说过,
他说用代理之类的可能处理不了
他提示我说用“方法描述”,后面他又不说了
但我连“方法描述”的概念都不知道
不知这边仁兄能否帮我解释下,谢谢了
xujunsweet 2007-01-25
  • 打赏
  • 举报
回复
假设用户控件页面是webcontrol,
webcontrol wb=(webcontrol)page.FindControl(webcontrol1 )
wb.aa=参数
其中aa是用户控件中的一个属性
uno 2007-01-25
  • 打赏
  • 举报
回复
你遇到的问题可能并不是委托无法使用

而可能是你的代码在处理顺序上出现了问题
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
还有一个问题就是,用反射时,ref参数和out参数要怎么处理
Eri 2007-01-25
  • 打赏
  • 举报
回复
如果是我,我会这么做:
每个页面都放一个固定的方法,在这个方法来来处理具体页面的不同方法。
就是做一个接口,然后需要引用这个用户控件的地方实现这个接口。
wj2929 2007-01-25
  • 打赏
  • 举报
回复
你贴一下你程序的关键代码
大家针对着看如何解决
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
这边的前辈们能不能出来帮帮小弟
谢谢了
N_ccw 2007-01-25
  • 打赏
  • 举报
回复
楼上的兄弟,谢谢指导(我原来是做WinForm的,可能是还带有些C/S下的思想,见笑了,呵呵)
请问您:这种想法能不能实现,希望能指点迷津
昨天根据wj2929(Rěй)说的用反射,但也没能实现
  • 打赏
  • 举报
回复
哦,当然,上面的程序是event的语法。但是基本上原理完全适用于普通的delegate,只是代码在语法稍有改变。
  • 打赏
  • 举报
回复
但是其关联的父对象this已经改变了 --> 但是其关联的父对象this中的某些功能已经改变了

  • 打赏
  • 举报
回复
不要用WinForm的概念来直接硬套。WinForm相对来说是非常简单的环境,它没有客户端-服务器分离的场景,完全是本地环境。而WebForm纯粹是服务器端的,而且还有“无状态”特点,许多东西都瞬间被释放掉。如上面所说,虽然你能够保存那样一个Delegate(实际这要求你的Session只能采用Inproc方式),但是其关联的父对象this已经改变了,而且也不是你想象的那种概念了。
  • 打赏
  • 举报
回复
可是我试验时是用Session来保存delegate的
——————————————————————————————————————————
匪夷所思。

假设一个这样的delegate对象x,那么显然它的this就是指向页面对象实例。当客户端页面postback之后服务器端是创建新的页面的实例的,你给新的控件的某个操作指向“旧的”httpContext已经被关闭的页面,很令人非议所思。我想你大概是没有仔细想这个问题比较随意。

根本不需要缓存,新的页面实例本身就“拥有”这个delegate的实例,例如你可以写:

protected void page_load(object sender,eventArgument e)
{
myUserControl.ButtonEvent_1 += new EventHandler(Button1_Click);
myUserControl.ButtonEvent_2 += new EventHandler(Button2_Click);
myUserControl.ButtonEvent_3 += new EventHandler(Button3_Click);
myUserControl.ButtonEvent_4 += new EventHandler(Button4_Click);
}

Button1_Click直到Button4_Click在当前页面实例中就有,何必到Session中去找呢?
bidisty 2007-01-24
  • 打赏
  • 举报
回复
如果说对象不够确切的话,那么

建一接口,接口有一个方法。
在页面中实现一个继承接口对象,实现接口中的方法,把对象传递给控件。
控件始终接收这个接口,因对象实现了接口,所以可以传递,
在控件里调用这个传递来对象的方法。

以上可能不能合适你的要求,只在参考。
N_ccw 2007-01-24
  • 打赏
  • 举报
回复
不是很明白意思,以下参考:

建一对象,对象有一个方法。
在页面中实例这个对象,实现对象中的方法,把实例传递给控件。
始终传递这个对象的实例给控件,控件里调用这个传递来对象的方法。
-----------------------------------------------------------------------
按您这样说的话,您在控件中就没法定义这个类型了,因为针对每个页面类都是不同的
我正在尝试反射
bidisty 2007-01-24
  • 打赏
  • 举报
回复
不是很明白意思,以下参考:

建一对象,对象有一个方法。
在页面中实例这个对象,实现对象中的方法,把实例传递给控件。
始终传递这个对象的实例给控件,控件里调用这个传递来对象的方法。
加载更多回复(10)

62,046

社区成员

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

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

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

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