0

这是一个新手问题。我已经有一段时间没有进行 C# 编程了,尤其是使用自定义类进行创建时。我想在我的表单之间共享一些数据,我正在考虑创建一个类,

public class User
{
    public string id;
    public string name;

    public User()
    {
    }

    public User(string id, string name)
    {
        this.id = id;
        this.name = name;
    }
}

该类是否必须位于单独的文件(User.cs)中?

如果我有以下代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        User user1 = new User("abc","cde");
    }
}

    public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();

    }
}

我应该如何创建类Form1以及我应该如何访问它Form2

4

6 回答 6

2

通常,您将类分成单独的文件,因此我建议制作一个User.cs 包含User该类的文件。

实例化类的Form1方式很好,但是要获取类的实例,Form2您需要将其传递给 的构造函数Form2,如下所示:

Form2 theForm2 = new Form2(user1);

注意:要完成上面的代码需要修改 的构造函数Form2,或者在这种情况下创建一个非默认构造函数,并创建一个成员变量来保存User类实例,如下所示:

public partial class Form2 : Form
{
    private User _user;

    public User TheUser
    {
        get
        {
            return _user;
        }
    }

    public Form2()
    {
        InitializeComponent();
    }

    public Form2(User theUser)
    {
        _user = theUser;
    }
}

现在您可以通过简单地引用属性来使用User该类。Form2TheUser

于 2013-08-01T15:13:11.627 回答
2

您如何分发文件的类完全取决于您。在这个例子中,我让你可以拥有 UserHandler.cs、User.cs、Form1.cs 和 Form2.cs。希望能帮助到你。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public static class UserHandler
    {
        private static  List<User> Users = new List<User>();

        public static void AddNewUser(User user)
        {
            Users.Add(user);
        }

        public static void RemoveUser(User user)
        {
            Users.Remove(user);
        }

        public static User GetUserById(int id)
        {
            if(Users.Exists(x => x.userId == id))
            {
                return Users.Find(user => user.userId == id);
            }

            return null;
        }
    }

    public class User
    {
        public int userId { get; set; }
        public string userName { get; set; }

        public User(int id, string name)
        {
            this.userId = id;
            this.userName = name;
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var _user = new User(1,"user2252502");
            UserHandler.AddNewUser(_user);
            MessageBox.Show(UserHandler.GetUserById(1).userName);
            Form2 form2 = new Form2();
        }

    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            MessageBox.Show(UserHandler.GetUserById(1).userName);
        }
    }
}
于 2013-08-01T15:23:26.303 回答
1

有多种方法可以做到这一点。一种方法是在 Form2 的构造函数中传递类。如下所示。

public partial class Form1 : Form
{
    User user1 = new User("abc","cde");
    public Form1()
    {
        InitializeComponent();
        new Form2(user1);
    }
}

public partial class Form2 : Form
{
    User user1;
    public Form2(User u)
    {
        InitializeComponent();
        user1 = u;    
    }
}

执行此操作的其他方法可以是在 form1 中公开一个返回 User 的公共属性。并且您在 Form2 中访问该属性。

于 2013-08-01T15:13:53.830 回答
0

它们可以在同一个文件中。如果要在 Form2 中访问 Form1 中的数据,请将 Form1 作为参数添加到 Form2 的构造函数中。或者将其作为属性添加到 Form2 中并允许它被“设置”。

于 2013-08-01T15:12:15.267 回答
0

我纯粹是从“我认为我一直在走你正在走的同一条路”的角度说话。

可能是时候将您的应用程序分解为一些模式了。User 类通常是应用程序中的一种特殊实体。在典型情况下,它可以定义用户的属性,也可以用于定义特定用户的身份和声明,或以上所有。

为您的用户创建一个服务或实用程序类会很好。如果您的应用程序中的任何给定表单或类需要有关用户的信息,您的服务将在那里接听电话。该服务可以提供 CurrentUser 属性,该属性将通知其他类当前登录的用户是 (null | Bob | xyz...) 它可以执行验证,访问后台实用程序以缓存有关用户的属性。但我离题了。在写我的答案时,@Iker Ruiz Amauda 给出了一个如何实施这项服务的实际例子。

至于如何在您的应用程序中使用它:这取决于您的项目的规模。我喜欢 Karl Anderson 提到的依赖注入。与依赖注入一起使用将是控制反转(IoC)。我目前的 IoC 风格是 MEF(http://mef.codeplex.com/documentation)。通过定义一个由 UserService 实现的 IUserService,您可以将此服务“注入”到任何依赖于 userservice 的形式中。在我当前的项目中,这实际上是通过使用属性来导出和导入项目来实现的。

有关控制反转的更多信息(我认为依赖注入非常简单,但谷歌是你的朋友,)请参阅堆栈溢出的答案:

https://stackoverflow.com/a/3140/93964

或者这是我在谷歌主题时发现的一个不错的博客条目:

http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

于 2013-08-01T17:16:33.543 回答
0
How should I create the class in Form1 and How should I access it in Form 2?

这取决于它的用途。由于您希望在表单之间共享它,我假设您希望它的范围是类范围的。将其定义为类属性。最好在你的构造函数之上Form1

Does the class have to be in a separate file, User.cs If I had the following code

它不一定是,但最佳实践是它是。

How do I share it with Form2?

A. 使其成为构造函数的参数Form2

public partial class Form2 : Form
{
    public User MyUser { get; set; }

    public Form2(User user)
    {
        InitializeComponent();
        MyUser = user;
    }
}

B. 将其设为公共属性Form2并将其设置为Form1

var frm2 = new Form2();
frm2.User = user;
于 2013-08-01T15:17:42.143 回答