如何在C#中将代码与GUI分离?

时间:2011-02-14 16:46:52

标签: c# winforms

我开发了一个C#脚本,可以打开XLS文件,解析它并创建一个XML文件列表来验证它们。
该程序的每个主要步骤都记录如下:

Console.WriteLine("Step Creating Xml 1... DONE!)
Console.WriteLine("Step Validating Xml 1... DONE!)

XLS文件路径当前是硬编码的,我正在创建一个带有Windows窗体的微型GUI,允许用户选择XLS文件并阅读程序中的步骤TextBox

我在创建按钮打开文件对话框以选择XSL文件方面没有问题但是,一旦选中,我很困惑如何编写部件代码以向用户显示程序的步骤信息。

完成此任务的最常用方法是保持核心程序GUI不可知?

3 个答案:

答案 0 :(得分:5)

如其他答案中所述,引发GUI处理的事件,显示您的日志文本。 这是一个完整的例子:

1)首先考虑信息带有什么信息,并扩展EventArgs类以定义参数事件类。我想要公开一个作为日志文本的字符串:

public class LogEventArgs : EventArgs
{
    public string messageEvent {get;set;}
}        

2)为简单起见,假设您的MyApplication类公开了您想要的业务方法。我们将从这里定义并举办活动。记录将是提升我们的日志事件的私有方法。

public class MyApplication
{
    public void BusinessMethod(){
        this.Logging("first");
        System.Threading.Thread.Sleep(1000);
        this.Logging("second");
        System.Threading.Thread.Sleep(3000);
        this.Logging("third");
     }
}

3)实施事件提升。对于句柄事件,我们使用委托,这既是在接收器(您的GUI)中必须实现哪些方法声明来使用事件的描述,也是指向接收器方法的指针。我们声明事件OnLogging。 在Inside Logging方法中,我们使用日志消息引发设置参数的事件。我们必须检查not null事件处理程序,因为如果事件没有侦听器,则句柄将为null(指向接收方事件使用者方法的空指针)。

    public delegate void OnLoggingEventHandler(object sender, LogEventArgs e);
    public event OnLoggingEventHandler OnLogging;

    private void Logging(string message)
    {
        LogEventArgs logMessage = new LogEventArgs();
        logMessage.messageEvent = message;
        if (OnLogging != null)
        {
            OnLogging(this, logMessage);
        }
    }

4)现在我们必须实现事件的监听器和使用它的方法。假设有一个窗口表单,其中包含一个启动应用程序业务方法的按钮和一个显示日志消息的文本框。这是没有事件监听器和消费者的形式。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MyApplication myApp = new MyApplication();
        myApp.BusinessMethod();
    }
}

5)我们定义一个消费者方法,用于处理在文本框中写入事件所引发的日志消息的事件。当然,该方法与代表具有相同的签名。

private void MyApplication_OnLogging(object sender, LogEventArgs e)
{
    this.textBox1.AppendText(e.messageEvent + "\n");
}

6)使用C#native操作符,我们将OnLogging事件绑定到事件使用者。

private void button1_Click(object sender, EventArgs e)
    {
        MyApplication myApp = new MyApplication();

        myApp.OnLogging += new MyApplication.OnLoggingEventHandler(MyApplication_OnLogging);
        myApp.BusinessMethod();
    }

答案 1 :(得分:2)

而不是在记录时编写Console.WriteLine,只需在GUI响应的对象上引发事件:

public delegate void LogDelegate(String _data);
public class Logger
{
    public event LogDelegate OnLog;

    public void Log(String _data)
    {
        if(OnLog != null)
            OnLog(_data);
    }
}

然后,在您的应用程序执行Console.WriteLine的任何地方,它只是在该类上调用该Log方法。您的GUI连接到OnLog事件并使用它执行所需的操作。

答案 2 :(得分:0)

我会在你的表单类中创建一个名为WriteLog或WriteOutputMessage的私有方法,在该方法中我会触摸UI,例如在新的多行文本框中添加一行新文本。这样,如果将来你想使用另一个控件来显示输出,比如网格或列表视图,你只需要改变1方法。