2016-09-14 92 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个文件,只有工具类知道这些路径。但是你是对的,我需要先理解它。谢谢你的详细解答。 –