2013-04-21 134 views
-2

由於某種原因,我的Windows窗體在運行程序後立即關閉。我可以看到表格大約一秒鐘,然後關閉。這裏是我的形式加載方法加載後立即關閉windows窗體

private void Form1_Load(object sender, EventArgs e) 
    { 
     CustGen = new CustomerGenerator(); 
     fuelType = null; 

     //set data on form initialization. 
     unleadedtank = 10000f; 
     dieseltank = 10000f; 
     u_price = 136.9f; 
     d_price = 152.2f; 

     //event subscriptions 

     CustGen.CustomerReady += CustomerReadySub; //Subscribes to ready event 
     CustGen.PumpProgress += PumpProgressSub; //subscribes to progress event 
     CustGen.PumpingFinished += PumpingFinishedSub; //subscribes to stop event 

    } 

,這裏是我的針對特定形式的Program.cs,雖然這是自動生成的,我不知道是否需要它。

 [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

這是customerGenerator類

public class CustomerGenerator 
{ 
    public CustomerGenerator(); 

    public event CustomerGenerator.CustomerReadyHandler CustomerReady; 
    public event CustomerGenerator.PumpingFinishedHandler PumpingFinished; 
    public event CustomerGenerator.PumpProgressHandler PumpProgress; 

    public void ActivatePump(); 
    public void Start(); 

    public delegate void CustomerReadyHandler(object sender, CustomerReadyEventArgs e); 

    public delegate void PumpingFinishedHandler(object sender, EventArgs e); 

    public delegate void PumpProgressHandler(object sender, PumpProgressEventArgs e); 
} 

我已經運行該程序,並開展哪些用戶之一,在下面的意見後說碰到這個來到之內。

public void CustomerReadySub(object sender, CustomerReadyEventArgs fuel) 
    { 
     string CustReady = null; 

     //checks what fuel is chosen and then activates the pump 
     fuelType = fuel.SelectedFuel.ToString(); 

     if (!String.IsNullOrEmpty(fuelType)) 
     { 
      fTypeLabel.Text = fuelType; 

這是拋出異常的線。另外它說:「跨線程操作無效:控制'Form1'從一個線程訪問,而不是它創建的線程。」

fuelType = fuel.SelectedFuel.ToString(); 

感謝

+1

如何顯示初學者的所有相關代碼..? – MethodMan 2013-04-21 22:03:24

+0

如果你刪除Form1_Load的正文,它的工作原理? – 2013-04-21 22:03:25

+0

你有沒有通過代碼..?如何定義'CustGen = new CustomerGenerator();' – MethodMan 2013-04-21 22:04:14

回答

1

而且它說:「跨線程操作無效:控制‘Form1的’從比它創建的線程以外的線程訪問」

使用以下方式來訪問你的窗體上的控件:

private void MyHandler(object sender, EventArgs e) { 
    if (InvokeRequired) Invoke(new EventHandler(MyHandler), sender, e); 
    else { 
    // code to handle the event 
    } 
} 

當你聽從那些在一個線程中執行某些對象發生的事件,處理該事件將運行的代碼那個線程。每當你從除創建這些對象的線程之外的線程訪問UI對象時,你將會得到一個異常。 InvokeRequired檢查是否在UI線程上運行,如果不是,則調用此方法以在UI線程上運行。這使您可以安全地訪問控件。

+0

嗨安德烈亞斯, 感謝您的意見,我只是想知道如果我做到了這一點的權利......如果你在上面看我的原始帖子我有一個CustomerReadySub,我只需將MyHandler更改爲CustomerReadySub? – DorkMonstuh 2013-04-21 23:41:02

+0

由於您使用自定義事件參數'new EventHandler(MyHandler)'不起作用,您必須使用適當的委託構造函數,例如'新的EventHandler (CustomerReadySub),sender,customerReadyEventArgs);'。您還可以將該處理程序轉換爲「Action '。 – Andreas 2013-04-22 07:24:46