111,128
社区成员
发帖
与我相关
我的任务
分享
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进行操作
}
}
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 类来更加明确地实现封装和扩展了。