这是一个新手问题。我有一段时间没有完成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
中访问该课程?
答案 0 :(得分: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
即可使用Form2
中的TheUser
课程。
答案 1 :(得分: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);
}
}
}
答案 2 :(得分: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中访问该属性。
答案 3 :(得分:0)
它们可以位于同一个文件中。如果要从Form2中的Form1访问数据,请将Form1作为参数添加到Form2的构造函数中。或者将其添加为Form2中的属性并允许它“设置”。
答案 4 :(得分: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?
一个。使其成为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;
答案 5 :(得分:0)
我说的纯粹是从“我认为我一直沿着你走下去的道路”的观点来看。
可能是时候将您的应用程序分解为某些模式了。 User类通常是应用程序中的一种特殊实体。在典型情况下,它可以定义用户的属性,也可以用于为特定用户或上述所有用户定义身份和声明。
为您的用户制作服务或实用程序类会很好。如果您的应用程序中的任何给定表单或类别需要有关于用户的信息,那么您的服务就可以接听电话。此服务可以提供CurrentUser属性,该属性将通知其他类当前登录的用户(null | Bob | xyz ...)它可以执行验证,访问后台实用程序以缓存有关用户的属性。但是我离题了。在写下我的答案时,@ Iker Ruiz Amauda给出了一个如何实现这项服务的实际例子。
关于如何在整个应用程序中使用它:它取决于项目的大小。我喜欢卡尔安德森提到的依赖注射。与依赖注入一起使用的是控制反转(IoC)。我目前的IoC风格是MEF(http://mef.codeplex.com/documentation)。通过定义UserService实现的IUserService,您可以将此服务“注入”任何依赖于用户服务的形式。在我目前的项目中,实际上使用属性来实现导出和导入项目。
有关控制反转的更多信息(我认为依赖注入很简单,但谷歌是你的朋友),请参阅关于堆栈溢出的答案:
https://stackoverflow.com/a/3140/93964
或者这是一篇不错的博客文章,我发现谷歌的主题是:
http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/