2016-09-14 42 views
1

我試圖學習C#和一般編程,我遇到了一個問題。我試圖尋找答案,但失敗了,所以我很抱歉,如果我複製了另一個話題。我有1窗體窗體(Form1),外部類(Class1),窗體上的按鈕和標籤。 這個類是一個簡單的文件粉碎機,從點擊按鈕開始。 Label1.text應該從外部類更新,顯示哪些文件正在被切碎。如何使用委託和事件?

我已經發現,我需要使用委託和事件來正確地發生,但我不知道如何正確使用它們。 代碼在這裏:

//Form1 
    private async void button2_Click(object sender, EventArgs e) 
    { 
    var task = new Task(() => 
    { 
    check = true; 
    bool success = FileUtilities.Shred(textBox1.Text); 
    }); 
    task.Start(); 
    public void ChangeName(string text) 
    { 
    label3.Text = text; 
    } 

    //Class1 
    public static bool ShredFile(string filePath, bool shouldDelete = true) 
    { 
    bool success = true; 
    try 
    { 
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Write); 
    //Label1.text = filePath; - should be like that. 

我曾嘗試使用public void ChangeName訪問屬性,但沒有奏效。我無法理解我應該在哪裏創建委託,事件以及訂閱此事件的位置。

更新:我已經發現了什麼問題。我的程序中有幾個線程,而且我無法通過我的課程訪問表單上的標籤。我不得不使用回調,之後訂閱和事件完美地工作。謝謝Thorsten Dittmar,以顯示正確的方式。

+2

看一看委託文件。 http://stackoverflow.com/documentation/c%23/1194/delegates#t=201609141320451060485 – Jacobr365

回答

0

實際上有幾種方法可以實現你想要的。我會採取以下方式,因爲它是最容易實現的,並且不涉及任何回調;-)

這背後的基本原則是:將UI更新留給維護UI的類。其他的一切都是一個工具,甚至不需要知道是否有用戶界面。

如果你在你的UI代碼點切碎的文件被觸發,執行三個步驟:

  1. 更新你的用戶界面,例如顯示文件的文件名被切碎(UI類)
  2. 撕碎的文件(工具類)
  3. 顯示成功或失敗的碎紙操作(UI類)的

看到了嗎? :-)

但你的問題沒有事件是如何實際創建和使用活動,所以....

一般事件由兩個部分組成的發送方:

  • 一個event
  • 引發事件

您聲明他們兩人就是這樣,對於爲例方法即

public class EventSender 
{ 
    public event EventHandler<EventArgsType> MyEvent; 

    protected void OnMyEvent(...) 
    { 
     if (MyEvent != null) 
      MyEvent(this, new EventArgsType(...)); 
    } 
} 

EventArgsTypeEventArgs一個子類,其可用於從發送器向接收器傳遞信息。舉個例子:

public class EventSender 
{ 
    public class EventArgsType : EventArgs 
    { 
     public EventArgsType(string fileName) : base() 
     { 
      FileName = fileName; 
     } 

     public string FileName 
     { 
      get; 
      private set; 
     } 
    } 

    public event EventHandler<EventArgsType> MyEvent; 

    protected void OnMyEvent(string filename) 
    { 
     if (MyEvent != null) 
      MyEvent(this, new EventArgsType(filename)); 
    } 
} 

每當事件應該提高,這足以從EventSender類中調用該方法OnMyEvent

現在接收器需要附加的事件,然後每當事件觸發的方法將被調用。示例

public class Receiver 
{ 
    private EventSender _sender; 

    public Receiver() 
    { 
     _sender = new EventSender(); 
     _sender.MyEvent += HandleMyEvent; 
    } 

    private void HandleMyEvent(object sender, EventSender.EventArgsType e) 
    { 
     // Do something with e.FileName 
    } 
} 

那麼,你會怎麼做?我想創建一個非靜態FileShredder實現一個或多個由例如類似事件,並有非靜態方法撕碎的文件。

在UI開始任何任務之前,我創建這個類的一個實例,附加所需的事件處理程序,然後我會用這個實例來粉碎的文件。在UI類中的事件處理程序中,更改標籤和內容。

+0

我已後'的FileStream FS =新的FileStream(文件路徑,FileMode.Open,FileAccess.Write)加入'OnMyEvent(文件路徑)'; '在我的工具類中,並且它始終返回null。它不能提高事件。 –

+0

那麼,如何首先創建一個示例項目,瞭解事情如何工作和*然後*試圖整合你學到的知識應用到目前的項目?而且,在你的例子中,即使這樣做也沒有意義。在開始任務之前,只需在「TextBox」中將標籤的文本設置爲文件名即可。完成 - –

+0

這是我的示例項目)'textBox'不是碎片的文件,而是位置。該測試文件夾中有1k個文件,只有工具類知道這些路徑。但是你是對的,我需要先理解它。謝謝你的詳細解答。 –