Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将完整的子窗体传递给另一个子窗体_C#_Winforms_Visual Studio 2010_.net 2.0 - Fatal编程技术网

C# 将完整的子窗体传递给另一个子窗体

C# 将完整的子窗体传递给另一个子窗体,c#,winforms,visual-studio-2010,.net-2.0,C#,Winforms,Visual Studio 2010,.net 2.0,我看到很多页面和问题都涉及将值从一种形式传递到另一种形式。我想做一些不同的事情。不是值,而是作为参数传递的整个表单。请不要,这不是MDI表格 我有一个带有两个按钮的父窗体。一个按钮可以创建一个Child1表单。另一个(可选)按钮调用不同的子窗体编辑器 第一个按钮是一个验证按钮,如果有效,它将显示Child1表单,其中包含一个填充键/值对的listviewbox。 第二个是具有自己按钮的编辑器。如果按下其中一个(提交)按钮,则应使用新的keyvaluepair更新第一个Child1表单 我一直面临

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

我有一个带有两个按钮的父窗体。一个按钮可以创建一个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(); 
    }
儿童组1:

    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);
            }
        }
    }
  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);
    }
我相信这很容易,但我搞不懂。如果有人能帮忙,我将不胜感激,节省我的时间!如果有更好的更新提交结果的方法也可以,请举例说明


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

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

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


与其让
Editor
成为父窗体的“子”窗体,不如让它成为
ChildForm
的子窗体(也称为父窗体的孙子)。当然,因为您没有使用MDI,这只是解决问题的一种逻辑方式,仅此而已

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


如果父窗体需要使用
编辑器执行任何其他操作,它可以通过
子窗体来执行。

主要是通过Servy提供的感知帮助。我不知道这是否会帮助其他人,因此以下是对我有效的方法:

父窗体MyBox,这与我最初认为它是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);
            }
        }
    }
  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);
    }

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

好的,很好的建议。(不去想它会觉得很愚蠢)但现在主窗体只有一个验证按钮,单击该按钮可创建ChildForm1。ChildForm1现在有一个创建编辑器的按钮。仍然存在一个问题…我无法从编辑器窗体刷新listviewbox。我不认为调用刷新按钮会起作用,是吗?;)@SuusvdVen正如我在回答中所说,主窗体仍然可以有创建
编辑器的按钮,它只是“遍历子窗体”。主窗体调用子窗体的方法,子窗体创建编辑器。至于如何将信息从编辑器传递给父级,只需执行与父级和子级之间始终通信相同的操作,并执行两次即可。让编辑器将信息传递给子级,子级将信息传递给父级。这将通过两个事件来实现。编辑器引发一个事件,子窗体使用该事件引发另一个事件。主(父)窗体不需要与编辑器一起工作,因此我将其放在ChildForm1中。我仍然无法根据编辑器更新ChildForm1中的listview。我目前正试图弄清楚我是否应该使用代理。但是谢谢。