事件可以像方法一样传入参数吗?

xz_ike 2016-10-24 11:11:43

privare void AddCheckedListBox()
{
CheckedListBox cb1 = new CheckedListBox();
Panel pa1=new Panel();
//pa1内生成控件代码省略
cb1.Items.Add("1");
cb1.Items.Add("2");
cb1.Items.Add("3");
cb1.Items.Add("4");
cb1.SelectedIndexChanged += new EventHandler(cb1_SelectedIndexChanged );
Controls.Add(cb1);
Controls.Add(pa1);
}
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
CheckedListBox cb1 = (CheckedListBox)sender;
for (int i = 0; i < cb1.Items.Count; i++)
{
if (cb1.GetItemChecked(i))
{
//想在这里传入pa1,对pa1进行操作
}
}

...全文
235 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iAm_Ike 2016-10-25
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
但是我的这个事件
引用 2 楼 caozhy 的回复:
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
我的AddCheckedListBox()其实是放在一个循环里调用的,然后pa1我按在循环里放进了一个panel数组,如果把pa1声明为公共变量,我就没法在循环中生成panel数组了。如果把panel数组声明为public,我要怎么将panel数组的对应值(比如panel数组的0号值)放进去呢。
iAm_Ike 2016-10-25
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
引用 2 楼 caozhy 的回复:
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
引用 3 楼 stherix 的回复:
这里比较适合的方法是 把cb1.Tag=pa1; 这样可以建立起联系
那如何对cb1.tag进行遍历?
stherix 2016-10-25
  • 打赏
  • 举报
回复
这里比较适合的方法是 把cb1.Tag=pa1; 这样可以建立起联系
threenewbee 2016-10-25
  • 打赏
  • 举报
回复
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
  • 打赏
  • 举报
回复
.Tag 是一个稀里糊涂的东西,没有明确的设计意图,而且也只有这一个混沌的 object 参数而不能应对多个明确参数的需求。 实际上,你要禁用 .Tag 这种糊涂的编程设计形式,选择清晰的逻辑方式!
  • 打赏
  • 举报
回复
以后除非有特殊情况,我觉得我是懒得去说明多年以前的那种设计模式了,而是仅仅说明匿名委托/lamda 编程形式。 但是要知道,你能看到第二种形式的介绍,实际上对原理就能深入理解。要比那些盲目照抄现代高效写法而不理原理的人,更好一些。
stherix 2016-10-25
  • 打赏
  • 举报
回复
引用 4 楼 xz_ike 的回复:
[quote=引用 2 楼 caozhy 的回复:] 你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
引用 2 楼 caozhy 的回复:
你这里不需要,只要把pa1 pa2定义成全局变量(类的成员变量就可以了。)
引用 3 楼 stherix 的回复:
这里比较适合的方法是 把cb1.Tag=pa1; 这样可以建立起联系
那如何对cb1.tag进行遍历?[/quote] 你每个combobox不都是对应一个panel吗 SelectedIndexChanged事件里 直接var panel=cb1.Tag as Panel就行了
  • 打赏
  • 举报
回复
有两种最常用的形式,一种是3、4年前的最新形式,另外一种是10几年前的古老形式,但是实际上原理一模一样! 首先,你可以使用“匿名委托”方式来轻松优雅地写代码:
cb1.SelectedIndexChanged += (sender,e) =>
{
           CheckedListBox cb1 = (CheckedListBox)sender;
            for (int i = 0; i < cb1.Items.Count; i++)
            {
                if (cb1.GetItemChecked(i))
                {
                         .....................
                 }
}
你在上面 ..................... 部分可以随便使用 pa1 等等的匿名委托/lamda表达式 之前的外部变量。这是最优雅的形式。 在多年以前的c#非常低级版本中,不支持lamda、甚至不支持匿名委托技术,那么你可以自己定义一个明确的类型来将委托封装到对象中:
public class ABC
{
    public Panel Pa1;

    public void Process(object sender, EventArgs e)
    {
         .............................
    }
}
注册事件处理方法时写

                 ABC p = new ABC();
                 p.Pa1 = pa1;
                cb1.SelectedIndexChanged += new EventHandler(p.Process);
你可以在 ABC 类中定义更多的 public 参数来扩展事件处理方法所要的参数(原本只有两个参数,不够用)。其关键是“面向对象设计”,首先将方法封装到 p 引用的独立对象中,就可以通过扩展 ABC 类来更加明确地实现封装和扩展了。
闭包客 2016-10-25
  • 打赏
  • 举报
回复
有了闭包,你就可以进行函数式编程,有了函数式编程……你就……呃……编不下去了……
threenewbee 2016-10-24
  • 打赏
  • 举报
回复
可以,使用委托就能实现

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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