将完整的子表单传递给另一个子表单

本文关键字:表单 另一个 | 更新日期: 2023-09-27 17:50:50

我看到很多页面和问题都涉及将值从一个表单传递到另一个表单。我想做点不一样的事。不是值,而是作为参数传递的整个表单。请不要,这不是MDI表格。

我有一个父窗体与2个按钮。其中一个按钮创建了一个Child1表单。另一个(可选)按钮调用不同的子表单编辑器。

第一个按钮是一个验证按钮,如果有效,将显示Child1表单,并显示一个充满键/值对的列表视图框。第二个是带有自己按钮的编辑器。如果其中一个(提交)按钮被按下,那么第一个Child1表单应该被更新为一个新的keyvaluepair。

我的问题是,我似乎不能得到Child1形式反映的变化。我不知道更新这个Child1表格最好的方法是什么我已经尝试过BeginUpdate with EndUpdate,并刷新它,现在所有的尝试,我已经有点迷路了。我希望有人能帮助我。

我实际上想做的是刷新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())。所以这是一些奇怪的我想,我正在创建一个新的实例的形式,并试图改变这个不存在的(空)形式,而不是实际的ChildForm1。但是我想从编辑器表单中刷新listviewBox

将完整的子表单传递给另一个子表单

与其让Editor成为父窗体的"子"窗体,不如让它成为ChildForm的子窗体(也就是父窗体的孙子)。当然,由于您没有使用MDI,这只是处理问题的一种逻辑方法,仅此而已。

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

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

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

看一下MVP模式,它对WinForms应用程序很有用。

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

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

其实很简单,只是没有马上看出来。我把它弄得比委派等需要的更复杂。