代码流没有遵循我的逻辑,我的列表也没有得到所需的输出。
public static List<String> genericList;
public static List<String> List1;
在frmLoadCurrentForm()中:
List1 = new List<String>();
genericList = new List<String>();
然后,在不同的地方(?按钮)
1 private void btn1_Click(object sender, EventArgs e)
2 {
3 genericList = List1.ToList();
4 call();
5 List1 = genericList.ToList();
6 }
private void call()
{
frmForm form = new frmForm();
for (int i = 0; i < genericList.Count(); i++)
form.lst.Items.Add(genericList.ElementAt(i));
form.Show();
//form updates genericList on exit with lst contents, tested
}
在遍历代码的过程中,我在第5行放置了一个断点,代码先转到第5行,然后转到第4行(并进入表单),然后不返回到第5行——所以我的List1不会随着call()内部发生的事情而更新。
我不明白这个逻辑,也不明白该怎么办
我使用多个列表和一个genericList,这样我就可以在多种情况下使用复杂的接口,理论上我的逻辑似乎是有效的。。。
在表单的出口处,genericList有正确的信息,而List1没有。为什么?
编辑:添加了列表的声明
编辑:当我逐步完成时,表单将开始呈现,但直到调用创建表单的方法的按钮末尾的代码被执行后才会完成。更奇怪的是,因为表单实例是在方法中创建的,所以它应该在方法结束时关闭并处理。。。
好吧,在第5行设置断点,就不会运行第5行;但是线路4上的呼叫仍将通过,并且程序将正常进行。第4行,您调用了一个函数,该函数有效地运行,然后在返回时停止。
只有当程序执行该特定行时,才会触发断点。C#不会线性地执行代码,它可以,但它不遵守这个规则。
看看http://www.ndepend.com/这是一个地图软件,它可能会在视觉上给你一个更好的想法。
如果我的回答是错误的,也请通知我,因此我不会传播错误的信息。谢谢
虽然我对您对上面的代码所做的操作感到困惑,但您应该注意,Form.Show()只有在打开的Form已关闭时才会返回-也许这是您感到困惑的原因。
此外,我不知道你想对ToList()方法的调用做什么,因为这个方法的目的是从IEnumerable对象生成一个列表对象,但你似乎从list生成了一个list,这对我来说没有意义
我还没有测试你的代码,但我认为你的代码应该像上面写的那样执行,没有任何问题,这意味着当你点击具有事件处理方法btn1_click的按钮时,执行应该如下:
- 执行第3行
- 控件进入call()块内的代码,并按顺序进行,直到Form.Show()调用。此调用允许显示表单,并且执行再次分支到内部表单代码
- 表单关闭后,执行返回到form.Show()调用后的第一行,该调用是该方法的大括号
- 下一个要执行的语句是事件处理方法的第5行
当您在btn1_Click方法的声明行放置断点并以循序渐进的方式逐步执行代码时,您应该会体验到这种行为。
这绝对是一个线程问题。
为了以最简单的方式解决它(而不是创建一个单独的线程),我用form.ShowDialog();
替换了form.Show()