c#:事件驱动代码中的操作顺序与流不匹配

时间:2012-07-18 20:15:58

标签: c# list event-handling

代码流不遵循我的逻辑,我的列表没有得到所需的输出。

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没有。为什么?

编辑:添加了列表声明

编辑:当我单步执行时,表单将开始渲染但直到调用创建表单的方法的按钮末尾的代码执行完毕才会完成。这更奇怪,因为表单实例是在方法中创建的,因此应该在方法结束时将其关闭并处理...

3 个答案:

答案 0 :(得分:1)

好吧,通过在第5行放置一个断点,你不会在第5行运行;但是第4行的呼叫仍然会通过,程序将正常进行。第4行,你调用了一个函数,它有效地运行,然后在它返回时停止。

断点仅在程序执行该特定行时触发。 C#没有线性执行代码,它可以,但它不符合该规则。

看看http://www.ndepend.com/这是一款地图绘制软件,它可能会在视觉上为您提供更好的创意。

如果我的答案有误,请通知我,因此我不会散布不正确的信息。谢谢!

答案 1 :(得分:1)

虽然我对上面代码的处理方式感到困惑但你应该知道Form.Show()只有在打开的Form已经关闭的情况下才会返回 - 这可能是你混淆的原因。

此外,我不知道你想要对ToList()方法的调用做什么,因为这个方法的目的是从IEnumerable对象生成一个列表对象,但你好像从List生成一个List对我来说没有意义。

我还没有测试过您的代码,但我认为您的代码应该执行,因为它上面写的没有任何问题,这意味着当您单击具有事件处理方法的按钮时btn1_Click被调用执行应该如下:

  1. 执行第3行
  2. control进入call()块内的代码并按顺序继续,直到调用Form.Show()。此调用允许显示表单,并再次将执行分支到内部表单代码。
  3. 当表单关闭时,执行返回到Form.Show()调用之后的第一行,这是该方法的结束括号。
  4. 要执行的下一个语句是事件处理方法的第5行。
  5. 当您在btn1_Click方法的声明行中放置断点并逐步执行代码时,您应该会遇到这种行为。

答案 2 :(得分:1)

这绝对是一个线程问题。

要以最简单的方式解决(而不是创建单独的线程),我将form.Show()替换为form.ShowDialog();