2

我看到很多页面和问题涉及将值从一种形式传递到另一种形式。我想做一些不同的事情。不是值,而是整个表单,作为参数传递。请注意,这不是 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);
            }
        }
    }

编辑器形式:

    private ChildForm1 originalForm = new ChildForm1();

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

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

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

4

3 回答 3

1

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

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

如果父表单需要对它做任何其他事情,Editor它可以通过ChildForm来完成。

于 2013-01-04T15:15:53.653 回答
0

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

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

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

于 2013-01-04T15:14:43.037 回答
0

很大程度上是通过 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;
    }
 }

其实很简单,但没有立即看到。我让它变得比代表等更复杂。这很简单,它似乎对我有用。

于 2013-01-04T16:41:45.370 回答