0

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

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 没有更新里面发生的事情调用()。

我不明白这个逻辑,也不明白该怎么做。

我正在使用多个列表和一个 genericList,以便我可以在多种情况下使用复杂的接口,理论上我的逻辑似乎是有效的......

在表单的出口处,genericList 有正确的信息,而 List1 没有。为什么 ?

编辑:添加列表声明

编辑:当我逐步完成时,表单将开始呈现,但直到调用创建表单的方法的按钮末尾的代码被执行后才会完成。更奇怪的是,因为表单实例是在一个方法中创建的,所以它应该在方法结束时关闭并处理掉......

4

3 回答 3

1

尽管我对您对上述代码的操作感到困惑,但您应该知道 Form.Show() 仅在打开的表单已关闭时才返回-也许这是您感到困惑的根源。

此外,我不知道您想对 ToList() 方法的调用做什么,因为此方法的目的是从 IEnumerable 对象生成列表对象,但您似乎从不对我有意义。

我没有测试你的代码,但我认为你的代码应该像上面写的那样执行,没有任何问题,这意味着当你单击具有事件处理方法 btn1_Click 的按钮时,执行应该如下:

  1. 第 3 行的执行
  2. 控制进入 call() 块中的代码并按顺序进行,直到 Form.Show() 调用。这个调用让表单显示出来,执行再次分支到内部表单代码。
  3. 当表单关闭时,执行返回到 Form.Show() 调用之后的第一行,这是该方法的右大括号。
  4. 下一条要执行的语句是事件处理方法的第 5 行。

当您在 btn1_Click 方法的声明行放置断点并逐步执行代码时,您应该会体验到这种行为。

于 2012-07-18T20:56:18.813 回答
1

这绝对是线程问题。

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

于 2012-07-19T00:43:48.670 回答
1

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

仅当程序执行该特定行时才会触发断点。C# 不能线性执行代码,它可以,但它不遵守该规则。

看看http://www.ndepend.com/这是一个地图软件,它可能会给你一个更好的想法,视觉上。

如果我的回答有误,请告知我,因此我不会传播错误信息。谢谢!

于 2012-07-18T20:25:39.723 回答