Размещение кода в windows.forms - PullRequest
2 голосов
/ 07 августа 2010

Я новичок в программировании на windows.forms.Я начал создавать приложение со следующим потоком событий:

  • нажмите кнопку, которая открывает файл - извлеките его содержимое в некоторый список строк - посетите некоторые веб-сайты - проанализируйте их содержимое - и т. Д.

Так как все в моем приложении происходит после того, как я нажимаю кнопку, чтобы открыть файл, я поместил весь свой код в событие нажатия кнопки.Однако я знаю, что это плохая практика кодирования, потому что я понял, что у меня ВСЕ поток программ внутри этого события click.Я знаю, что событие должно содержать только код, связанный с кнопкой, но где разместить код, который следует, если не внутри события?Есть ли другое событие, которое я должен использовать вместо записи всего одним нажатием кнопки?

Надеюсь, я прояснил свой вопрос.Если нет, то я попытаюсь объяснить мою проблему.Я просто не знаю, где написать код, который следует за событием click.Если я введу это значение:

public Form1()
{
    InitializeComponent();
}

.., тогда оно будет выполнено до события щелчка, что неверно.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 07 августа 2010

Типичный способ сделать это - написать один или несколько методов, которые выполняют действие, и вызвать их из события 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 голос
/ 07 августа 2010

Вы можете инкапсулировать всю работу, которую вы хотите сделать, в другую функцию в классе формы. Конечно, доступ к его модификации будет PRIVATE (если только вы не хотите, чтобы другой класс имел доступ к методу). Внутри вашего обработчика события button_click вы можете вызвать эту новую функцию. Это самый простой способ сделать это. В противном случае вы можете использовать пример, приведенный в ссылке выше @Robert S.

0 голосов
/ 07 августа 2010

Вы должны взглянуть на шаблон Presenter Model Viewer. http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...