Как поместить один пользовательский элемент управления WinForms в три формы и обновить все три одновременно? - PullRequest
1 голос
/ 20 февраля 2010

Как создать UserControl, который

например 3 winforms и 1 UserControl,

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

Отредактированный

Я думаю, что это работает сейчас. темная область - пользовательский контроль с некоторым содержанием альтернативный текст http://img28.imageshack.us/img28/6169/naamloostl.png

альтернативный текст http://img36.imageshack.us/img36/7362/naamloos1bt.png

Ответы [ 4 ]

2 голосов
/ 20 февраля 2010

... слишком долго для комментария ... может добавить к этому пример кода, если OP запрашивает ...

Если 'WinForms, добавьте тег "WinForms" к своим тегам.

Возможно, вы захотите уточнить: вы ищете здесь решение, которое будет «масштабироваться», чтобы охватить случай, когда у вас может быть много элементов управления в UserControl (десятки? Сотни?), Который вы повторно используете во многих формах, все из которых должны быть синхронизированы:

Если вы (ищите увеличения), то я думаю, что вам нужно изучить «DataSource, как предлагает Асад» (обратите внимание, что только некоторые элементы управления WinForms [например, ComboBox] имеют «свойство DataSource»), и Связывание данных, как предлагает Джейк; оба эти ответа указывают на необходимость «высокоуровневого» подхода к синхронизации состояния.

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

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

Или, в зависимости от вашего дизайна и требований, если вы можете согласиться с тем, что каждый UserControl обновляется не сразу: вы можете отложить запуск обновления до тех пор, пока пользователь не переключится на другую форму: тогда ранее активная форма вызовет свое событие «Деактивировать»: в В этом событии вы можете определить, изменились ли настройки (используя какой-то «грязный бит» в UserControl?), а затем обновить другие UserControls по мере необходимости: однако, я думаю, вы действительно хотите немедленное обновление.

Еще одна хорошая вещь, imho, чтобы уточнить, чтобы получить лучшие ответы здесь, может быть: как именно создаются эти несколько форм, каждая из которых содержит экземпляр одного и того же UserControl: есть ли одна «Основная форма», которая создает все остальные экземпляры формы: или это модель «SDI», где каждая форма создается независимо. Есть ли у какого-либо из форм свойство Parent, установленное в ненулевое значение (т. Е. Есть ли у какой-либо из форм другая форма как родительская)?

Если вам нужен пример работающего кода с использованием открытого статического класса для «небольшого» решения вашего вопроса «как задано»: просто спросите здесь, и я опубликую один: это не будет «элегантно», "но это будет работать:)

2 голосов
/ 20 февраля 2010

держите их так же DataSource

public void UpdateControls()
  {
    List<string> filesDataSource = GetFiles(); // replace with your Datasource

    Control1.DataSource = filesDataSource ;
    Control2.DataSource = filesDataSource ;
    Control3.DataSource = filesDataSource ;

    Control1.DataBind();
    Control2.DataBind();
    Control3.DataBind();
  }

  Control1_SelectedIndexChanged(.............) // Replace with your evnents
  {
   // 
   //
   UpdateControls();
  }
1 голос
/ 13 декабря 2010

Лучшее решение - иметь статический класс с обработчиком событий и открытым методом.

public static class Signal
{
    public static EventHandler OnSignal {get;set}
    public static void SendSignal()
    {
        if (OnSignal !=null) OnSignal(this,new EventArgs());
    }
}

В вашем winform:

protected void Form1_load(object sender, EventArgs e)
{
    Signal.OnSignal += new EventHandler(IGotSignal)
}

protected void IGotSignal(object sender, EventArgs e)
{
    MessageBox.Show("i got a signal")
}

protected void button1_Click(object sender,EventArgs e)
{
    Signal.SendSignal();
}
0 голосов
/ 20 февраля 2010

Каждая форма будет содержать уникальный экземпляр UserControl. Вам придется использовать привязку событий / данных, чтобы изменения в одной форме вызывали обновления в других.

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