我有一個帶有按鈕,標籤和進度條的窗體,這樣當我單擊該按鈕時,它將創建一個類b的實例來運行進程。一旦這個過程完成,它會調用一個EventHandler在主窗體的標籤中顯示「done」!爲什麼一個事件是空的? (對象引用未設置爲對象的實例)
我創建了一個委託(SetStatus)的事件(SetStatusEvent)來做到這一點。它似乎很好,當我調用事件處理(usbforProcessExited)外的這個事件,但是當我把它從usbforProcessExited它給出了一個錯誤 -
object reference not set to an instance of an object
主要形式
public partial class main : Form
{
b rsSet = new b();
public main()
{
InitializeComponent();
rsSet.SetStatusEvent += new RemoteS.SetStatus(updateStatus);
}
private void button1_Click(object sender, EventArgs e)
{
rsSet.FormatUSB();
}
private delegate void UpdateStatus(int i, string str, Color clr);
private void SetStatus(int i, string str, Color clr)
{
this.progressBar1.Value = i;
this.lbl_status.ForeColor = clr;
this.lbl_status.Text = str;
}
private void updateStatus(int i, String msg, Color color)
{
object[] p = GetInokerPara(i, msg, color);
BeginInvoke(new UpdateStatus(SetStatus), p);
}
private object[] GetInokerPara(int progress, string msg, Color color)
{
object[] para = new object[3];
para[0] = progress;
para[1] = msg;
para[2] = color;
return para;
}
}
乙級
class b
{
public delegate void SetStatus(int i, string msg, Color color);
public event SetStatus SetStatusEvent;
System.Diagnostics.Process usbfor = new System.Diagnostics.Process();
public void FormatUSB()
{
usbfor.StartInfo.FileName = @"usbformat.bat";
usbfor.EnableRaisingEvents = true;
usbfor.Exited += new EventHandler(usbforProcessExited);
usbfor.Start();
}
public void usbforProcessExited(object sender, EventArgs f)
{
SetStatusEvent(100, "DONE", Color.Green); //ERROR HERE! (object reference not set to an instance of an object
}
}
問題在哪裏?
你應該學會產生最少的工作例子。你的代碼包含很多與這個問題無關的東西。 – CodesInChaos
我不認爲這是你的問題的原因,但你不需要「usbfor.EnableRaisingEvents = true」的過程來提高退出事件? –
@ChrisSpicer OPS!其實我有這條線!我只是想盡量減少我發佈的代碼量。謝謝你提到那個部分。 – daygoor