Как поместить один пользовательский элемент управления WinForms в три формы и обновить все три одновременно?

Как создать пользовательский элемент управления, который

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

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

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

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

замещающий текст http://img36.imageshack.us/img36/7362/naamloos1bt.png< /а>


person User6996    schedule 20.02.2010    source источник
comment
Поздравляю с получением работы! Вы использовали статический класс Public для централизованного обновления? Между прочим, отложенная синхронизация текстовых полей WinForms — это заноза в заднице, если вы еще не заметили. Удачи,   -  person BillW    schedule 20.02.2010
comment
да, я использую публичный класс. спасибо за вклад   -  person User6996    schedule 20.02.2010
comment
Ваш вопрос был одним из источников вдохновения для разработки метода многократного обновления, показанного здесь, в этом вопросе SO: stackoverflow.com/questions/2391828/ Спасибо!   -  person BillW    schedule 06.03.2010


Ответы (4)


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

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

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

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

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

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

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

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

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

person BillW    schedule 20.02.2010
comment
Я больше не уверен в том, что я хочу. возможно, я должен пример может ситуация немного больше. У меня есть основная форма (+ UserControls), которая по большей части скрыта, пользователь может получить доступ к ее содержимому только для уведомления. поэтому мне нужна вторая форма, которая отображает то, что происходит внутри основной формы, и при необходимости отменяет/перезапускает прогресс. малый масштаб звучит как решение для меня. это будет более чем здорово, если вы опубликуете свой образец. - person User6996; 20.02.2010
comment
@ Power-Mosfet Мне (и, думаю, другим, кто это читает) было бы полезно, если бы вы описали именно то, что хотите увидеть. Сколько пользовательских элементов управления одновременно видно пользователю? Также было бы полезно узнать, какой тип элементов управления находится в UserControl : если это элементы управления, у которых есть свойство «DataSource», то, как предложил выше Асад, у вас есть встроенная функция привязки данных. Если элементы управления не имеют «DataSource», например, TextBox или CheckBox, то вы находитесь в совершенно другом месте с попыткой привязки данных, и именно здесь может пригодиться код, подобный тому, что я опубликую. - person BillW; 20.02.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();
  }
person Asad    schedule 20.02.2010
comment
Извините, но я еще не понял. держите то, что указывает на тот же источник. любой работающий образец будет отличным. Спасибо - person User6996; 20.02.2010

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

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

В вашей винформе:

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();
}
person stephan wegener    schedule 12.12.2010

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

person Jake    schedule 20.02.2010