Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Winforms_Oop - Fatal编程技术网

C# 将对象从一个窗体传递到另一个窗体

C# 将对象从一个窗体传递到另一个窗体,c#,.net,winforms,oop,C#,.net,Winforms,Oop,我有一个相当大的CRUD winform应用程序,用于显示嵌入TabControl中的表单。我希望有个人的对象,(有一个)注册,(有一个)在与表单交互时保存和跟踪信息的计划。我如何做到这一点?我在我的程序.cs中找到了一个声明Person对象的建议,就像这样--> 这是最好的方式吗?一旦他们在搜索页面上做出选择,仍然需要从数据库中填写大量数据。在每个表单上声明对象并以某种方式传递它怎么样?对象会随着它们的进展而慢慢“构建”。首先,他们通过姓名搜索某人,并选择他们将与之合作的人。然后他们就可以处理

我有一个相当大的CRUD winform应用程序,用于显示嵌入TabControl中的表单。我希望有个人的对象,(有一个)注册,(有一个)在与表单交互时保存和跟踪信息的计划。我如何做到这一点?我在我的程序.cs中找到了一个声明Person对象的建议,就像这样-->

这是最好的方式吗?一旦他们在搜索页面上做出选择,仍然需要从数据库中填写大量数据。在每个表单上声明对象并以某种方式传递它怎么样?对象会随着它们的进展而慢慢“构建”。首先,他们通过姓名搜索某人,并选择他们将与之合作的人。然后他们就可以处理这些注册。选择注册后,他们将能够与这些计划交互


在此,我将非常感谢您的指导,因为这一范围使我缺乏经验,头晕目眩……

您需要将数据、逻辑和GUI分开

调查这件事

如果您认为它在您的情况下太复杂,您可以创建一个中央控制器类来保存中央数据。在每个表单构造函数中传递这个对象,您就完成了。

a)Singleton

从代码重用的角度来看,全局静态属性不是一个好主意。如果您计划从代码的所有部分访问全局静态属性,那么您将使您的代码与这个特定的应用程序紧密相连

如果您的代码中始终只有一个
Person
实例,那么您可以将该实例放在
Person
类中,但肯定不能放在
程序
类中。然而,请注意,单例类的使用通常仅限于日志服务或其他非常普遍的服务,它肯定永远不会改变

b)同一对象参考

在这种情况下,您不需要单例实例,而是将相同的引用传递给您的数据对象(Person或其他任何对象)到访问它的每个表单。如果表单是数据的一部分的表示,则只能将该部分数据传递给表单,最好通过最简单的接口

更改一个表单中的数据可能需要更新其他表单。这就是Model View Controller和类似模式帮助您完成的任务-通知视图数据已在其他地方更改


例如,通过在
Person
类中实现IPropertyNameChanged接口,可以在属性发生更改时通知任何感兴趣的人(任何形式)。请检查以下示例:。通过将事件处理程序附加到每个表单中的该事件,您将通知所有事件处理程序它们需要失效。

看看设计模式。

单例是有害的。如果您尝试数据绑定之类的方法,它们会导致很多问题。例如,绑定到静态类中静态的Person对象根本不起作用。我同意,如果我没有说得更清楚,我很抱歉-我确实说过拥有全局静态属性是个坏主意,但我只是想声明,将其放置在静态程序类中是个非常坏的主意。
internal static class Program
{
    public static CurrentPerson _CurrentPerson;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmWWCShell());
    }
}
 Program._CurrentPerson = new CurrentPerson
                                     {
                                         PersonID = Convert.ToInt32(pID),
                                         LastName = lName,
                                         FirstName = fName,
                                         SocialSn = sSN,
                                         MiddleName = mName,
                                         BirthDate = Convert.ToDateTime(bDate)
                                     };