Поднять пользовательские события в C # WinForms - PullRequest
10 голосов
/ 29 июля 2010

У меня есть несколько событий, которые я создал сам, и мне было интересно, как их поднять, когда я захочу.

Вероятно, мой дизайн приложения также испорчен, возможно, на это стоит взглянуть.

Это структура

ProgramContext
 - Form MainWindow
  + Control TextBox
  + Control Button
  + ...

В этом случае MainWindow.TextBox содержит некоторую информацию, которая довольно часто обновляется во время выполнения. Итак, мне как-то нужно, чтобы оно само обновлялось, когда я хочу (чтобы он мог перезагрузить свои данные из базы данных, где они хранятся)

Я пытался подключить EventHandler к Validating -Event, но, похоже, это не сработало.

Итак, в основном у меня есть метод, который перезагружает данные в ProgramContext

DataTable table = _adapter.GetData();
foreach (DataRow row in table.Rows)
{
  MainWindow.TextBox.Text += table.Text.ToString();
}

Это необходимо делать всякий раз, когда выполняется другой метод (который записывает новые данные в table).

Есть идеи?

1 Ответ

15 голосов
/ 29 июля 2010

Редактировать: кажется, что ваш вопрос больше связан с подключением к определенному событию, но ниже показано, как в общем случае запускать пользовательские события.

Обработка измененного события TextBox

Насколько я понимаю, вы хотите, чтобы внешняя сторона отслеживала события, возникающие из текстового поля в форме, а затем перезагружала данные в другой форме?

Быстро и грязно было бы сделать форму TextBox общедоступной.и тогда другие могут подписаться на это событие

MainForm.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);

ИЛИ в более поздних версиях C #:

MainForm.textBox1.TextChanged += this.textBox1_TextChanged;

Добавление собственного пользовательского события

Другим, более чистым способом было бы поднять пользовательское событие , например, MyDataChangedEvent ниже.Это позволит вам абстрагироваться от того факта, что изменения вообще происходят из текстового поля.

// Assuming you need a custom signature for your event. If not, use an existing standard event delegate
public delegate void myDataChangedDelegate(object sender, YourCustomArgsHere args);

// Expose the event off your component
public event myDataChangedDelegate MyDataChangedEvent;

// And to raise it
var eventSubscribers = MyDataChangedEvent;
if (eventSubscribers != null)
{
   eventSubscribers(this, myCustomArgsHere);
}

Вы также можете взглянуть на блок составных приложений Ent Lib и фабрику программного обеспечения Smart Client - здесь есть очень гибкий механизм разбивки событий / паба для синхронизации между UI «SmartParts» (элементы управления,диалоги форм и т. д.) в слабосвязанном виде. (CAB теперь очень устарел).

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