【问题标题】:Passing a Complete Child Form to another Child Form将完整的子表单传递给另一个子表单
【发布时间】:2013-01-04 15:06:17
【问题描述】:

我看到很多页面和问题涉及将值从一种形式传递到另一种形式。我想做一些不同的事情。不是值,而是整个表单,作为参数传递。请注意,这不是 MDI 表格。

我有一个带有 2 个按钮的父表单。一个按钮可创建 Child1 表单等。另一个(可选)按钮调用不同的子表单编辑器。

第一个按钮是一个验证按钮,如果该按钮有效,则会显示 Child1 表单,其中包含一个填充了键/值对的列表视图框。 第二个是带有自己按钮的编辑器。如果按下其中一个(提交)按钮,则应使用新的键值对更新第一个 Child1 表单。

我遇到的问题是我似乎无法让 Child1 表单反映更改。我不知道更新此 Child1 表单的最佳方法是什么。我已经用 EndUpdate 尝试了 BeginUpdate,并刷新了它,现在经过所有尝试,我有点迷失了。我希望有人可以帮助我。

我真正想做的是刷新 ChildForm1,说它是一个收件箱,当某些东西被“保存”或从第二个子窗体编辑器添加时。在第二个子窗体编辑器中单击按钮,第一个子窗体应该会刷新。

父表单:

    public ChildForm1 MyboxofValues; 

    private void btn1_Click(object sender, EventArgs e)
    {
            MyboxofValues = new ChildForm1();
            MyboxofValues.Show();
    }

    private void btn2_Click(object sender, EventArgs e)
    {
        Editor myEditor = new Editor();
        myEditor.Show(); 
    }

ChildForm1:

    public ChildForm1()
    {
        InitializeComponent();
        updateMe();

    }
    public void updateMe()
    {
        listView1.Items.Clear();
        if (MainCode.subRows.Count > 0)
        {
            foreach (KeyValuePair<string, string> element in MainCode.subRows)
            {
                ListViewItem lvi = new ListViewItem(element.Value);
                lvi.SubItems.Add(element.Key);
                listView1.Items.Add(lvi);
            }
        }
    }

EditorForm:

    private ChildForm1 originalForm = new ChildForm1();

    private void btnSubmit_Click(object sender, EventArgs e)
    {
            originalForm.updateMe();
    }

我确信这很容易,但我无法理解。如果有人可以提供帮助,我们将不胜感激,为我节省几个小时!如果有更好的方法来更新提交结果也可以,请举个例子?

出于测试目的,我为 ChildForm1 创建了一个“刷新”按钮,它可以工作! (它实际上只是调用了updateMe()。所以我认为这很奇怪,我正在创建表单的一个新实例并试图更改这个不存在的(null)表单而不是实际的ChildForm1。但我想刷新listviewBox来自编辑器表单。

【问题讨论】:

    标签: c# winforms visual-studio-2010 .net-2.0


    【解决方案1】:

    与其让Editor 成为父表单的“子”表单,不如让它成为ChildForm 的子表单(又名父表单的孙子)。当然,由于您没有使用 MDI,这只是解决问题的一种合乎逻辑的方式,仅此而已。

    与其让父级从创建Editor,不如让ChildForm 创建它。当父窗体的第二个按钮被点击时,它会调用类似CreateEditorChildForm 的方法。当它创建编辑器时,它显然可以存储它以供以后交互。

    如果父表单需要用Editor 做其他事情,它可以通过ChildForm 来做。

    【讨论】:

    • 好的,很好的建议。 (没想到会觉得很愚蠢)但是现在主窗体只有验证按钮,单击该按钮会创建 ChildForm1。 ChildForm1 现在具有创建编辑器的按钮。仍然是一个问题......我无法从编辑器表单刷新列表视图框。而且我不认为调用有效的刷新按钮,是这样吗? ;)
    • @SuusvdVen 正如我在回答中所说,主窗体仍然可以具有创建Editor 的按钮,它只是“通过子窗体”。主窗体调用子窗体的方法,子窗体创建编辑器。至于如何将信息从编辑器传递给父级,只需执行与始终在父子之间进行通信相同的操作,然后再执行两次即可。让编辑将信息传递给孩子,孩子将信息传递给父母。这将通过两个事件来完成。编辑器引发一个事件,子表单使用它来引发另一个事件。
    • 主(父)窗体不需要与Editor一起工作,所以我把它放在ChildForm1中。我仍然无法从 ChildForm1 获取列表视图以根据编辑器进行更新。我目前正试图弄清楚我是否应该使用代表。不过谢谢。
    【解决方案2】:

    我建议不要从另一个表单更新一个表单,而是将工作数据存储在像视图模型这样的对象中,并始终从中刷新您的表单。

    查看对 WinForms 应用程序有用的 MVP 模式。

    http://martinfowler.com/eaaDev/ModelViewPresenter.html

    【讨论】:

      【解决方案3】:

      很大程度上得益于 Servy 的敏锐帮助。我不知道这是否对其他人有帮助,所以这对我有用。:

      父表单,MyBox,按照我原先的想法,原来是ChildForm1:

        public MyBox()
          {
              InitializeComponent();
              updateMe();
          }
          public void updateMe()
          {
              listView1.Items.Clear();
              if (MainCode.subRows.Count > 0)
              {
                  foreach (KeyValuePair<string, string> element in MainCode.subRows)
                  {
                      ListViewItem lvi= new ListViewItem(element.Value);
                      lvi.SubItems.Add(element.Key);
                      listView1.Items.Add(lvi);
                  }
              }
          }
          private void btnCreateEditor_Click(object sender, EventArgs e)
          { 
              plainTextEditor editor = new plainTextEditor(this);
              Form1.editorOpen = true;
              editor.Show(this);
          }
      

      这个表单有一个按钮,它调用编辑器表单,现在看起来像这样:

      public partial class Editor : Form
      {
          private MyBox listviewBoxForm;
      
          public Editor(listviewBoxForm _form1)
          {
              InitializeComponent();
              inboxForm = _form1;
          }
       }
      

      其实很简单,只是没有马上看到。我让它变得比委托等更复杂。这很简单,似乎对我有用。

      【讨论】:

        猜你喜欢
        • 2017-06-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        • 2022-01-15
        相关资源
        最近更新 更多