Общение между формами - PullRequest
       1

Общение между формами

2 голосов
/ 07 декабря 2010

Я хотел бы знать, как взаимодействовать между формами с помощью C #?

В Visual Basic это было проще, поскольку у каждой формы есть свой собственный экземпляр, с C # он отличается.

В Program Класс I настраиваю открытую и статическую переменную, в которой хранится моя форма:

public static FormProcess2 frmProcess2 = null;

Затем в методе Main я создаю форму и показываю ее:

frmProcess2 = new FormProcess2();
frmProcess2.ShowDialog();

Сейчаскогда эта форма загружается, она загружает фоновый процесс, который обрабатывает файлы XML.И метод, который обрабатывает все файлы, находится в другом имени класса XMLParser.Таким образом, в BackgroundWorker doWork я загружаю этот метод следующим образом:

XMLParser.Start();

Теперь возникает вопрос, как я могу изменить элементы управления frmProcess2 в классе XMLParser?Я хотел, чтобы он показывал, что обновляется, изменяя текст метки, а также помещал там хорошую индикаторную строку.

Но я не могу получить доступ к элементам управления Program.frmProcess2, все, что я могу получить - это только настройки по умолчанию...

Ответы [ 4 ]

3 голосов
/ 07 декабря 2010

ну вы можете использовать делегатов для связи между окнами форм.Проверьте http://www.c -sharpcorner.com / uploadfile / mosessaur / winformsdelegates09042006094826am / winformsdelegates.aspx

Для делегатов

EDIT

Проверка Делегаты (Руководство по программированию в C #)

http://msdn.microsoft.com/en-us/library/ms173171%28VS.80%29.aspx

Создание пользовательских делегатов и событий в C #

http://www.csharphelp.com/2007/02/creating-custom-delegates-and-events-in-c/

Введение в делегаты и мероприятия

http://www.csharp -station.com / Tutorials / lesson14.aspx

2 голосов
/ 07 декабря 2010

Используйте BackgroundWorker класс для обновления прогресса.

alt text

2 голосов
/ 07 декабря 2010

Чтобы получить доступ к вашим элементам управления пользовательского интерфейса, работающим в потоках пользовательского интерфейса, вам нужно сделать функцию делегата для доступа к элементам управления пользовательского интерфейса, так как элементы управления becoz 1 потока не могут быть доступны другим потокам, в вашем случае ваш фоновый поток хочет получить доступ к пользовательскому интерфейсууправление потоками, это можно сделать, создав функцию делегата.

    //sample delegate function
    //this function is to request i.e invoke UI thread controls
    private void deleteGridRow()
    {
        if (autoGridView.InvokeRequired)
        {
            autoGridView.Invoke(new Action(delegate() { deleteGridRow(); }));
        }
        else
            autoGridView.Rows.RemoveAt(0);
    }

эта функция должна вызываться внутри backgroundworker1_DoWork(){deleteGridRow();}, и вы можете использовать ее для статуса:

    private void backThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lableStatus.Text = "your status"
    }

BackgroundWorker: MSDN

1 голос
/ 07 декабря 2010

Я не думаю, что вам нужно общение внутри формы. Это фоновая нить для формирования связи, которая вам нужна.

В вашем frmProcess2 подпишитесь на событие BackgroundWorker.ProgressChanged. Из вашего метода doWork периодически вызывайте это событие.

Страница 45 из Threads в C # Джозефа Албахари имеет отличный пример

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