簡體   English   中英

無法在2種表單之間提高自定義事件處理能力

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM