0

The flow of code doesn't follow my logic, and my lists don't get the required output.

public static List<String> genericList;
public static List<String> List1;

in frmLoadCurrentForm():

List1 = new List<String>();
genericList = new List<String>();

Then, in various places (? buttons)

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
}

While stepping through my code, I put a breakpoint on line 5, and code goes to line 5 then 4 (and into the form), then doesn't go back to 5 - so my List1 doesn't get updated with what happens inside the call().

I don't understand this logic, or what to do about it.

I am using multiple lists and a single genericList so that I can use a complicated interface for multiple situations, and theoretically my logic seems valid...

At the exit from the form, genericList has the right info, List1 doesn't. Why ?

Edit: added declaration of lists

Edit: As I step through, the form will start rendering but will not finish until the code at the end of the button that called the method that created the form got executed. Which is even more odd, since the form instance is created in a method so it should be closed and disposed of at the end of the method...

4

3 に答える 3

1

上記のコードで何をしているのか混乱していますが、Form.Show()は、開いたフォームが閉じられている場合にのみ返されることに注意してください。これが混乱の原因である可能性があります。

さらに、このメソッドの目的はIEnumerableオブジェクトからリストオブジェクトを生成することであるため、メソッドToList()の呼び出しで何をしたいのかわかりませんが、リストからリストを生成していないようです。私には理にかなっています。

私はあなたのコードをテストしていませんが、問題なく上記のように実行する必要があると思います。つまり、イベント処理メソッドbtn1_Clickを持つボタンをクリックすると、実行は次のようになります。

  1. 3行目の実行
  2. 制御はcall()ブロック内のコードに入り、Form.Show()が呼び出されるまで順番に進みます。この呼び出しにより、フォームが表示され、実行が内部フォームコードに再度分岐されます。
  3. フォームが閉じられると、実行はメソッドの閉じ中括弧であるForm.Show()呼び出しの後の最初の行に戻ります。
  4. 次に実行されるステートメントは、イベント処理メソッドの5行目です。

btn1_Clickメソッドの宣言行にブレークポイントを設定し、コードを段階的にステップ実行すると、まさにこの動作が発生するはずです。

于 2012-07-18T20:56:18.813 に答える
1

Well, by putting a breakpoint at Line 5, you're not going to be running line 5; but the call on line 4 will still go through, and the program will proceed normally. Line 4, you called a function, which effectively ran, then stopped when it came back.

Breakpoints are only triggered when the program executes that specific line. C# doesn't execute code linearly, it can, but it is not held to that rule.

Take a look at http://www.ndepend.com/ It's a mapping software, and it might be able to give you a better idea, visually.

Please inform me if my answer is wrong, as well, therefore I do not spread incorrect information. Thanks!

于 2012-07-18T20:25:39.723 に答える
1

It was definitely a threading problem.

To solve it the easiest way possible (instead of creating a separate thread), I replaced form.Show() with form.ShowDialog();

于 2012-07-19T00:43:48.670 に答える