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

时间:2013-01-04 15:06:17

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

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

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

第一个按钮是一个验证按钮,如果有效,则调出Child1表单,其中listviewbox填充了键/值对。 第二个是带有自己按钮的编辑器。如果按下其中一个(提交)按钮,则应使用新的keyvaluepair更新第一个Child1表单。

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

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

父母表格:

    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来自编辑表格。

3 个答案:

答案 0 :(得分:1)

不是让Editor成为父表单的“子”形式,而是使其成为ChildForm(也就是父母的孙子)的子表单。当然,既然你没有使用MDI,这只是解决问题的合理方式,仅此而已。

不要让父母创建Editor,而是让ChildForm创建它。单击父表单的第二个按钮后,它会调用CreateEditor ChildForm之类的方法。当它创建编辑器时,它显然可以存储它以供以后的交互。

如果父表单需要对Editor执行任何其他操作,则可以通过ChildForm来执行此操作。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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;
    }
 }

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