使用变量命名事件处理程序



更新于2022年11月10日

我在Winforms程序中有以下代码:

void CreateCheckBoxes(Control parentControl, int left, int top, int lineSpace)
{
List<string> listVariables = new List<string>() { "AllowColumnReorder", "CaptureFocusClick", "ColScaleMode", "ColumnTracking", "RowTracking", "EnsureVisible", "FullRowSelect", "GridLines", "HideSelection", "HoverSelection", "IsFocused", "LabelEdit", "MultiSelect", "Scrollable", "VisualStyles" };

foreach (string varName in listVariables)
{
CheckBox ctlTemp = new CheckBox { Name = "chk" + varName, Text = varName, Top = top, Left = left };
parentControl.Controls.Add(ctlTemp);
top += lineSpace;
}
chkAllowColumnReorder.CheckedChanged += new EventHandler(chkAllowColumnReorder_CheckedChanged);
//  The name 'chkAllowColumnReorder' does not exist in the current context
}

它的工作程度,我可以创建尽可能多的复选框,我喜欢基于listVariables的长度。但是,我希望CheckedChanged事件处理程序的名称基于控件的名称。

就像我最初的问题一样,我现在发现我不能通过{name = "chk"中提供的名称来引用复选框。+ varName,在调试器中监视"name";返回表单的名称。我以前没有使用过这种形式的构造函数,我正在努力寻找关于它的任何文档。在我继续讲课之前,有人能帮帮忙吗?

有办法做到这一点吗?

代码本身是由一个小程序产生的,我只是在主程序中输入变量的名称,它产生了上面的,以及所有的vent处理程序,这是一个巨大的节省时间。

jimi -我把这个贴出来作为回答,因为评论太长了。

我最后写了:

Dictionary<string, Action<CheckBox>> m_Actions = new Dictionary<string, Action<CheckBox>>();

then loop through:

m_Actions.Add("chkAllowColumnReorder", (c) => containerListView1.AllowColumnReorder = c.Checked); etc.

然后:

void chkTemp_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTemp = ((CheckBox)sender);
m_Actions[chkTemp.Name](chkTemp);
}

这对我来说是全新的,我仍然不确定它是如何(或为什么)工作的,但非常感谢你告诉我它-我现在可以将变量粘贴到我的应用程序的形式,并产生所有的代码来添加控件到我需要测试的应用程序。

我这样做是因为我的心在一个应用程序中添加一堆复选框来测试ExtendeListView,最后编写这产生代码比测试有趣得多!

最新更新