使用Singleton时在Winform之间进行C#传递属性 [英] C# Passing Properties Between Winforms When Using Singleton
本文介绍了使用Singleton时在Winform之间进行C#传递属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
好,所以我试图将一个布尔值从登录"表单传递到主页"表单,通常这对我来说很好,我只会使用一个属性.但是我以为这次可以使用类似的方法,但是我正在表单上实现单例工厂.
这是与此相关的登录代码:
AdminAccess属性得到很好的设置,我已经检查了该值是否正确.
私有 bool adminAccess;
公共 布尔 AdminAccess
{
获取 {返回 adminAccess; }
私有 设置 {adminAccess = 值; }
}
私有 无效 btnLogin_Click(对象发件人,EventArgs e)
{
// 某些代码确实有用
OpenHome();
}
私有 无效 OpenHome()
{
HomeForm CreateHomeForm = HomeForm.HomeUI;
CreateHomeForm.StartupHome = 此;
// 尝试设置属性.
CreateHomeForm.AdminPermissions = 此 .AdminAccess;
CreateHomeForm.Show();
此 .Hide();
}
以下是主页"表单中的相关代码:
公共 HomeForm()
{
InitializeComponent();
// 只是为了快速检查属性中的内容
textBox1.Text = AdminPermissions.ToString();
}
私有 布尔 adminPermissions;
公共 布尔 AdminPermissions
{
私有 获取 {返回 adminPermissions; }
set {adminPermissions = value ; }
}
公共表格StartupHome
{
设置;
获取;
}
私有 静态 HomeForm homeUI;
公共 静态 HomeForm HomeUI
{
获取
{
如果(homeUI == 空 || homeUI.IsDisposed)
{
homeUI = 新 HomeForm();
}
返回 homeUI;
}
}
当HomeUI if循环作为表单的新实例运行时,将重置该值.我似乎无法考虑如何修改它以获得有效的解决方案.如您所知,我还是一个业余爱好者,所以我只是在寻找一种快速,干净的解决方案:)
解决方案
您为什么不直接通过HomeForm构造函数传递值呢? /blockquote>
我得出的解决方案如下:
公共 HomeForm() { InitializeComponent(); } 私有 无效 HomeForm_Shown(对象发件人,EventArgs e) { 如果(管理员权限) { btnCreateUser.Visible = true ; } 其他 { btnCreateUser.Visible = false ; } } 私有 布尔 adminPermissions; 公共 布尔 AdminPermissions { 获取 {返回 adminPermissions; } set {adminPermissions = value ; } } 公共表格StartupHome { 设置; 获取; } 私有 静态 HomeForm homeUI; 公共 静态 HomeForm HomeUI { 获取 { 如果(homeUI == 空 || homeUI.IsDisposed) { homeUI = 新 HomeForm(); } 返回 homeUI; } }
这是有关表单协作的流行问题.最健壮的解决方案是在Form类中实现适当的接口,并传递接口引用而不是对Form的整个实例"的引用.请查看我过去的解决方案以获取更多详细信息:如何以两种形式在列表框之间复制所有项目 [private bool adminAccess; public bool AdminAccess { get { return adminAccess; } private set { adminAccess = value; } } private void btnLogin_Click(object sender, EventArgs e) { //Some Code Does Stuff OpenHome(); } private void OpenHome() { HomeForm CreateHomeForm = HomeForm.HomeUI; CreateHomeForm.StartupHome = this; //Trying to set the property. CreateHomeForm.AdminPermissions= this.AdminAccess; CreateHomeForm.Show(); this.Hide(); }
Here is the relevant code from the Home form:
public HomeForm() { InitializeComponent(); //just to check what is in the property quickly textBox1.Text = AdminPermissions.ToString(); } private bool adminPermissions; public bool AdminPermissions { private get { return adminPermissions; } set { adminPermissions = value; } } public Form StartupHome { set; get; } private static HomeForm homeUI; public static HomeForm HomeUI { get { if (homeUI == null || homeUI.IsDisposed) { homeUI = new HomeForm(); } return homeUI; } }
The value gets reset when the HomeUI if loop runs as a new instance of the form is created. I can''t seem to think how to modify this to get a working solution. As you can tell I am fairly amateur so I''m just looking for a quick and clean solution to this :)
Thank you very much for your time in advance!解决方案Why don''t you just pass the value through the HomeForm constructor?
The solution I have come to is as follows:
public HomeForm() { InitializeComponent(); } private void HomeForm_Shown(object sender, EventArgs e) { if (AdminPermissions) { btnCreateUser.Visible = true; } else { btnCreateUser.Visible = false; } } private bool adminPermissions; public bool AdminPermissions { get { return adminPermissions; } set { adminPermissions = value; } } public Form StartupHome { set; get; } private static HomeForm homeUI; public static HomeForm HomeUI { get { if (homeUI == null || homeUI.IsDisposed) { homeUI = new HomeForm(); } return homeUI; } }
This is the popular question about form collaboration. The most robust solution is implementation of an appropriate interface in form class and passing the interface reference instead of reference to a "whole instance" of a Form. Please see my past solution for more detail: How to copy all the items between listboxes in two forms[^].
—SA
这篇关于使用Singleton时在Winform之间进行C#传递属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文