我可以在不创建新实例的情况下访问另一个用户控件中的表单控件吗?

时间:2018-12-04 21:52:17

标签: c# winforms

Admin是具有标签的表单,我希望在运行时从另一个表单或另一个用户控件访问它

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


    }
    public Label lbl
    {
        get { return label8; }
        set { label8.Text = value.ToString(); }

    }
}

用户控制:

Admin.lbl.text="something";  //could i do this and how ??

但是如果我创建了一个新实例,则应该关闭旧实例以显示更改 但我不想在运行期间一直这么做

1 个答案:

答案 0 :(得分:0)

Abanoub-如果我了解您要执行的操作-您想设置一个已经显示的表单的标签而不创建该表单的新实例。至少有一种方法可以使用持有表单实例的单例类。因此,将只有一个实例的形式。请尝试以下操作:

首先,我们创建一个保留表单实例的单例类:

public class Singleton
{
    // Modified from: http://csharpindepth.com/articles/general/singleton.aspx

    // This will keep ONE instance of the Admin Form
    private Admin _adminForm; 
    public Admin AdminForm
    {
        get
        {
            if (_adminForm == null)
            {
                _adminForm = new Admin(); 
            }
            return _adminForm; 
        }
    }
    private static Singleton instance = null;

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

现在,您可以从此实例中实例化,例如:

按钮1将显示以下形式:

    private void button1_Click(object sender, EventArgs e)
    {
        var singleton = Singleton.Instance;
        var f = singleton.AdminForm; 
        f.Show(); 
    }

按钮2将设置已经显示的表单标签(顺便说一句-我想您希望属性设置标签的 text 而不是标签正确吗?)

    private void button2_Click(object sender, EventArgs e)
    {
        // Assuming you clicked button 1 first, 
        // this will not cause a new instance but use the existing one
        var singleton = Singleton.Instance;
        var f = singleton.AdminForm;
        f.LabelText = "Hello world!";
    }

假设您要设置标签的文本-这是Admin中的修改属性:

    public string LabelText
    {
        get { return label8.Text; }
        set { label8.Text = value; }
    }

我希望这对您有帮助-祝您好运!