windows.forms中的代码放置

时间:2010-08-07 18:27:22

标签: c# winforms

我是windows.forms编程的新手。我开始创建一个具有以下事件流的应用程序:

  • 单击打开文件的按钮 - 在某些字符串列表中提取其内容 - 访问某些网站 - 解析其内容 - 等。

因为我点击按钮打开文件后,我的应用程序中的所有内容都发生了,所以我将所有代码都放在了按钮的click事件上。但是我知道这是糟糕的编码实践,因为我意识到我最终在该click事件中拥有所有程序流。我知道该事件应该只包含与按钮相关的代码,但是如果不在事件内部,则放置后面的代码的位置?是否还有其他事件我应该使用而不是仅仅在按钮点击中写入所有内容?

我希望我的问题清楚明了。如果没有,那么我会重新解释我的问题。我根本不知道在哪里编写click事件后面的代码。如果我把它放进去:

public Form1()
{
    InitializeComponent();
}

..然后它在click事件之前执行,这是错误的。

提前谢谢。

3 个答案:

答案 0 :(得分:4)

执行此操作的典型方法是编写一个或多个执行操作的方法,并从click事件中调用这些方法。对于任何长时间运行的操作,请在后台工作线程中执行。

例如:

public void myButton_OnClick(EventArgs e, object sender)
{
    VisitWebSites();
}

private void VisitWebSites()
{
    var webSiteList = GetWebSitesFromFile();
    foreach (var w in webSiteList) {
        StartVisitingWebSite(w);
    }
}

private IEnumerable<string> GetWebSitesFromFile()
{
    // whatever
}

private void StartVisitingWebSite(string url)
{
    backgroundWorker1.RunWorkerAsync(url);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string url = (string)e.Argument;
    e.Result = VisitWebSite(url);
}

private string VisitWebSite(string url)
{
    // This is called in background thread.  Do whatever you do to return data.
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error || e.Cancelled)
        return;

    string result = e.Result.ToString();

    // Do whatever you do with the result
}

查看BackgroundWorker文档,了解如何在后台线程中执行操作,然后处理其结果。

答案 1 :(得分:1)

您可以将要执行的所有工作封装到表单类中的另一个函数中。它的修改访问权限当然是PRIVATE(除非你希望另一个类能够访问该方法)。从button_click事件处理程序内部,您可以调用此新函数。这是最简单的方法。否则,您可以使用@Robert S上面链接中提供的示例。

答案 2 :(得分:0)

您应该查看模型视图Presenter模式。 http://msdn.microsoft.com/en-us/magazine/cc188690.aspx