使用Singleton时在Winform之间进行C#传递属性 [英] C# Passing Properties Between Winforms When Using Singleton

查看:114
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆