【问题标题】:How to Put One WinForms User Control on Three Forms and Update All Three Simultaneously?如何将一个 WinForms 用户控件放在三个窗体上并同时更新所有三个?
【发布时间】:2011-01-19 00:30:29
【问题描述】:

如何创建一个UserControl

例如 3 个 winforms 和 1 个 UserControl,

将 UserControl 添加到所有表单,但如果用户通过单击其中一个表单更改了 UserControl 内容,则所有表单都会显示相同的更改。

已编辑

我认为它现在可以工作了。暗区是有一些内容的用户控件 alt text http://img28.imageshack.us/img28/6169/naamloostl.png

alt text http://img36.imageshack.us/img36/7362/naamloos1bt.png

【问题讨论】:

  • 恭喜它开始工作!您最终是否使用公共静态类来集中更新?顺便说一句,如果您没有注意到的话,WinForms TextBoxes 的延迟同步是一件令人头疼的事情。祝你好运,
  • 是的,我使用公共课程。感谢您的输入
  • 您的问题是开发此 SO 问题中显示的多重更新技术的“灵感”来源之一:stackoverflow.com/questions/2391828/… 谢谢!

标签: c# winforms data-binding user-controls


【解决方案1】:

...评论太长...如果 OP 请求,可能会添加一个代码示例...

如果是“WinForms”,请在您的标签中添加“WinForms”标签。

您可能想澄清一下:您是否在这里寻找一种解决方案,该解决方案将“扩大”以涵盖您可能在 UserControl 上有许多控件(数十个?数百个?)您在许多表单上重复使用的情况,所有这些都需要同步:

如果您正在(寻求扩大规模),那么我认为您将需要探索“Asad 建议的 DataSource(请注意,只有某些 WinForms 控件 [例如 ComboBox] 具有 'DataSource 属性),并且'杰克建议的数据绑定;这两个答案都指向您需要一种“更高级别”的同步状态方法。

对于“较小规模”的解决方案,您可以考虑添加一个“设置”文件,并将其用作当前值的存储库。

在任何情况下,您仍然需要引发一个事件……在当前具有焦点的 UserControl 中进行每次更改……以触发其他 UserControl 实例中控件的更新。

或者,根据您的设计和要求,如果您可以接受每个 UserControl 不会立即更新:您可以推迟触发更新,直到用户切换到另一个表单:然后先前活动的表单将触发其“停用事件:在该事件您可以检测设置是否已更改(在 UserControl 中使用某种“脏位”?),然后根据需要更新其他 UserControl:我猜您确实想要立即更新。

恕我直言,为了在此处获得最佳响应,要澄清的另一件好事可能是:这些多个表单(每个表单都包含相同 UserControl 的实例)究竟是如何创建的:是否有一个“主表单”正在创建所有其他表单实例:或者这是一个“SDI”模型,其中每个表单都是独立创建的。是否有任何 Form 的 Parent 属性设置为非空值(即是否有任何 Form 有另一个 Form 作为 Parent)?

如果您想要一个使用公共静态类来“按要求”解决您的问题的“小规模”解决方案的工作代码示例:只需在此处询问,我会发布一个:它不会是“优雅的, “但它会工作:)

【讨论】:

  • 我不再确定我想要哪个。也许我应该多举例子。我有一个主窗体(+ UserControls),它在很大程度上是隐藏的,用户只能在通知点访问它的内容。所以我需要第二个表单来显示主表单内发生的事情,如果需要取消/重新启动进度。 “小规模”对我来说听起来像是一个解决方案。如果您发布您的示例,那就太好了。
  • @Power-Mosfet 如果您准确地描述您想看到的内容,它将对我(以及其他阅读此内容的人)有所帮助。任何时候用户可以看到多少个 UserControl?了解 UserControl 中的控件类型也将有所帮助:如果它们是具有 'DataSource 属性的控件,那么,正如上面建议的 Asad,您具有内置的数据绑定功能。如果控件没有 'DataSource,例如 TextBox 或 CheckBox,那么您在尝试数据绑定时就处于一个真正不同的地方,这就是我将发布的代码可以派上用场的地方。
【解决方案2】:

让他们指向同一个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();
  }

【讨论】:

  • 对不起,我还没明白。保持指向同一来源的内容。任何工作相同的样品都很好。谢谢
【解决方案3】:

更好的解决方案是拥有一个带有事件处理程序和公共方法的静态类。

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();
}

【讨论】:

    【解决方案4】:

    每个表单都将承载一个唯一的 UserControl 实例。您必须使用事件/数据绑定来使一种形式的更改导致其他形式的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2016-07-30
      相关资源
      最近更新 更多