2013-04-21 99 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