2011-02-25 50 views
0

我已經創建:無法訪問PictureBox的陣列

private System.Windows.Forms.PictureBox [] RedBoxes; 

然後在的Form_Load,我做的:

RedBoxes = new PictureBox[20]; 
for (int i = 0; i < 20; i++) 
{ 
    RedBoxes[i] = new PictureBox(); 
    RedBoxes[i].Image = global::IDMTestClient.Properties.Resources.Red; 
    RedBoxes[i].Name = "RedBox" + i.ToString(); 
    RedBoxes[i].Size = new Size(1, 38); 
    RedBoxes[i].Location = new Point(i + 10, 32); 
    RedBoxes[i].TabIndex = i + 2; 
    RedBoxes[i].TabStop = false; 
    groupBox3.Controls.Add(RedBoxes[i]); 
    RedBoxes[i].Visible = false; 
    RedBoxes[i].BringToFront(); 
} 

現在,當我嘗試訪問其他功能RedBoxes,它拋出一個:

「在System.Windows.Forms.dll中發生類型'System.InvalidOperationException'的第一次機會異常」

例如:
當我這樣做:

RedBoxes[i].Left = 10; 

RedBoxes[i].Location = new Point(10, 32); 

我在做什麼錯?

/------------------ UPDATE -------------------/

基{System.SystemException} = {「跨線程操作無效:從除線程以外的線程訪問控制‘groupBox3’創建它上。」}

這就是RedBoxes [I]具有。 WinForms自動生成線程的工作?

+0

@ user633943 - 在代碼中,您在執行這兩個操作,因爲它們不在您發佈的主代碼示例中? - 對不起,如果這是一個愚蠢的問題 – 2011-02-25 10:41:29

+0

你使用線程嗎?請提供更多示例代碼作爲@Digger要求,以便人們不必一直猜測,直到有人得到正確的答案。 – 2011-02-25 10:58:45

+0

第一個(帶for循環)在form1_load();我做「RedBoxes [i] .Location =新點(10,32)」的地方;「是form1的成員函數。 – Ram 2011-02-25 11:06:27

回答

0

到GUI的任何變化必須由GUI線程中完成的。 GUI線程也需要是免費的,以便它可以檢查Windows消息隊列並立即重新繪製應用程序。

解決方法是在需要時調用GUI更改,但在後臺保留背景。

我做了一個類繼承形式,這種自動執行:http://blog.tedd.no/index.php/2010/07/10/c-net-winforms-gui-thread-invoke-solution/

這裏還可以看到如何進行調用。

private delegate void GUIInvokeMethodDelegate(Action @delegate); 
/// 
/// Invoke command with GUI thread. Usage: GUIInvoke(() => FormOrControl.Cmd()); 
/// 
/// Command to execute in form:() => Cmd() 
public void GUIInvokeMethod(Action @delegate) 
{ 
    // Check if we need to invoke as GUI thread 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new GUIInvokeMethodDelegate(GUIInvokeMethod), @delegate); 
     return; 
    } 

    // Execute 
    @delegate.Invoke(); 
} 

public void DoThisAsGUI() 
{ 
    GUIInvokeMethod(() => 
    { 
     // Something you want to do in GUI thread. 
    }); 
    // or 
    GUIInvokeMethod(() => SomeMethodThatRequiresGUIThread()); 
} 

請注意,您可以用例如Form的實例更改「this」。

+0

工作。謝謝。 – Ram 2011-03-04 06:17:56

0

確保您的其他方法與UI線程處於相同的線程。不允許從其他線程進行更改。

如果它真的該調用可以調用方法來設置位置,這樣的方法,另一個線程:

This.Invoke(Delegate to method to invoke,arg as Object) 
+0

這應該會引發一個通常足以描述性的MDA異常。 – 2011-02-25 10:57:21

+0

具有for循環和我試圖更改位置的代碼片段位於兩個不同的函數(form1的兩個成員)中。私人System.Windows.Forms.PictureBox [] RedBoxes;也顯然是'form1'的成員 – Ram 2011-02-25 11:05:57

+0

@Tedd Hansen:什麼是MDA異常? – Ram 2011-02-25 12:35:28