[英]Trouble with raising custom event handling between 2 forms
C#的新手。 像標題一樣,我很難舉起比賽。 最終將以另一種形式使用它。
我正在嘗試做的是創建一個tcp客戶端,連接然后關閉的自定義用戶控件(我的事件引發表單)的許多實例。 當此tcp客戶端出現“錯誤”時,無論是捕獲異常,我都希望引發一個事件。 我現在通過關閉互聯網進行測試來強制執行該錯誤。 我的第一個問題是,我什至根本無法籌集到該活動。 我將在自定義用戶控件上顯示正在使用的事件代碼:
public delegate void TaskCompleteEventHandler(object sender, TaskCompleteEventArgs e);
public event TaskCompleteEventHandler TaskComplete;
public class TaskCompleteEventArgs : System.EventArgs
{
// add local member variables to hold text
private string errorString;
// class constructor
public TaskCompleteEventArgs(string ErrorString)
{
this.errorString = ErrorString;
}
// Property
public string ErrorString
{
get
{
return errorString;
}
set
{
errorString = value;
}
}
}
這是我處理異常的方法,理想情況下將引發事件並允許宿主窗體相應地打印字符串和異常。
private void ErrorLogging(string ex)
{
errorString = String.Format(/*...errorString formatting...*/);
// instance the event args and pass it the errorString value
TaskCompleteEventArgs args = new TaskCompleteEventArgs(errorString);
// raise the event with the updated arguments
TaskComplete(this, args); //----> THIS IS WHERE I GET AN ERROR!! <----
this.Dispose();
}
錯誤是Object reference not set to an instance of an object.
為Object reference not set to an instance of an object.
這是我的TaskComplete(this, args)
的“監視”屏幕TaskComplete(this, args)
我似乎無法調試這個……我還不夠強大,還不知道我做錯了什么。 它是如何引起副作用的?
我敢肯定,當我開始這樣做時,我的主要表單上會有更多問題。有人知道這是什么原因嗎? 提前致謝。
編輯:在我的主要形式:
public Form1()
{
InitializeComponent();
// Start control disabled and subscribe each control the event
foreach (var control in controlList)
{
control.Enabled = false;
control.TaskComplete += new dev_emu_project.dev_emu_widget.TaskCompleteEventHandler(OnTaskComplete);
}
}
List<dev_emu_project.dev_emu_widget> controlList = new List<dev_emu_project.dev_emu_widget>();
public void OnTaskComplete(object sender, dev_emu_project.TaskCompleteEventArgs e)
{
//.... work for processing
}
}
之所以收到NullReferenceException
是因為您正在調用一個空事件,這意味着尚未向其注冊任何委托。 您需要確保TaskComplete
在調用之前不為null。
在調用之前添加一個空檢查,以確保有人確實注冊了您的活動:
if (TaskComplete != null)
{
TaskComplete(this, args);
}
從MSDN Event Tutorial
:
調用事件
類聲明了事件后,就可以將該事件視為所指示的委托類型的字段。 如果沒有客戶端將事件的委托連接到該字段,則該字段將為null,否則它將引用在調用事件時應調用的委托。 因此,調用事件通常是先檢查null然后調用事件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.