问题 从Form1访问Form2

Gr8Gpa

新成员
加入
3月27日,2021年
消息
3
编程经验
3-5
我在C#中写了一个小型Windows桌面应用程序,具有两种形式。 Form1包含存储和更新Form2上一组图表统计信息的活动。当我使用ShowDialog()从Form1上的按钮打开Form2时,我可以看到图表已按预期更新。但是,一旦开放和关闭了Form2,新统计数据不再从Form1活动更新到Form2图表上。没有抛出异常,并且没有删除图表上的收集信息。新数据不再注册。没有进入很多细节,有人以前听说过这种行为吗? Form1上的断点显示仍在以前收集数据,以及发送该数据的代码正在执行。新数据只是没有出现。此外,这个应用程序在VB.NET中工作,我首先写了它。也许我的C#翻译可能是麻烦,因为我还没有学到的两种语言的不同。
 
Solution
如果没有看到你的代码,有点难以告诉,但最常见的原因是两个新秀错误:

- 第二种形式实例化了第一种形式的另一副本,并认为当实际上它正在与新实例交谈时,它思考它正在与原始的第一形式交谈。

- 使用Windows Forms控件UI(AKA视图)用于存储数据(AKA该模型),而不是创建模型的一个实例,并在视图之间传递。

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,887
地点
切萨皮克,va.
编程经验
10+
如果没有看到你的代码,有点难以告诉,但最常见的原因是两个新秀错误:

- 第二种形式实例化了第一种形式的另一副本,并认为当实际上它正在与新实例交谈时,它思考它正在与原始的第一形式交谈。

- 使用Windows Forms控件UI(AKA视图)用于存储数据(AKA该模型),而不是创建模型的一个实例,并在视图之间传递。
 
解决方案

Gr8Gpa

新成员
加入
3月27日,2021年
消息
3
编程经验
3-5
谢谢 - 跳伞,为您的快速回复。事实证明,与您的第一个解释有关的实例化问题。当我打开Form2查看统计数据时,然后再次关闭它,我阻止它能够接收额外的数据。解决方案是在Form1上ShowDialog()之后立即重新加载Form2。
public void button1_click(对象发件人,eventargs e)
{
myform2.showdialog();
MyForm2.Form2_Load(发件人,e);
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,717
地点
悉尼,澳大利亚
编程经验
10+
谢谢 - 跳伞,为您的快速回复。事实证明,与您的第一个解释有关的实例化问题。当我打开Form2查看统计数据时,然后再次关闭它,我阻止它能够接收额外的数据。解决方案是在Form1上ShowDialog()之后立即重新加载Form2。
public void button1_click(对象发件人,eventargs e)
{
myform2.showdialog();
MyForm2.Form2_Load(发件人,e);
}
不,没有,没有双重!这不是任何事情的解决方案。这是恶魔般的代码。有两种方法可以使用对话表。更频繁的是,您应该在您需要时创建和销毁表格,例如,当您需要它时,例​​如,
C#:
using (var dialogue = new SomeForm())
{
    // Push data into the dialogue form here, e.g.
    dialogue.SomeProperty = someValue;
    
    if (dialogue.ShowDialog() == DialogResult.OK)
    {
        // Pull data out of the dialogue here, e.g.
        var someOtherValue = dialogue.SomeOtherProperty;
        
        // ...
    }
}
您创建表单对象,按下所需数据,显示它,然后,如果用户未取消操作,则会在关闭时获取数据,然后销毁数据。这就是您应该在100中使用的对话99次的方式。每次显示对话时,都会有罕见的时间在您需要使用相同的表单对象。在这种情况下,第一次创建一个新实例,然后继续显示它们每个后续时间,例如,
C#:
private SomeForm dialogue;
和:
C#:
if (dialogue == null)
{
    dialogue = new SomeForm();
    
    // Push data required on the first run into the dialogue form here, e.g.
    dialogue.SomeProperty = someValue;
}
else
{
    // Push data required on subsequent runs into the dialogue form here, e.g.
    dialogue.SomeOtherProperty = someOtherValue;
}

// Push data required on every run into the dialogue form here, e.g.
dialogue.YetAnotherProperty = yetAnotherValue;

if (dialogue.ShowDialog() == DialogResult.OK)
{
    // Pull data out of the dialogue here, e.g.
    var theFinalValue = dialogue.TheFinalProperty;

    // ...
}
您只在第一次运行时创建表单对象,然后继续显示相同的表单对象,从不销毁它。

如果你没有做这两件事中的一个,那么你就是错误的。
 

Gr8Gpa

新成员
加入
3月27日,2021年
消息
3
编程经验
3-5
谢谢你的回复,jmplhinney。我明白你在说什么。此外,我在博客中遇到了多种形式之间的数据。非常丰富的,并与我在C#的自我训练中有关。我会尽力通过所有这些并报告。可能还要等一下。
 
最佳 底部