【问题标题】:Access form label from another class/namespace从另一个类/命名空间访问表单标签
【发布时间】:2015-04-22 19:14:05
【问题描述】:

我知道这个问题已经被问过数千次了,但经过大量研究后我还是找不到解决方案,我对这篇文章感到非常抱歉。

我想从另一个命名空间中的类访问我的标签。 这是一个代码示例,可以更好地理解我想要做什么:

public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }
    }



//class in another namespace
class Servers
    {
        public void _SetlabelText()
        {
           Main.label1.Text = "New Text";
        }
    }

我应该如何以正确的方式做到这一点?

【问题讨论】:

  • 简单来说,你不能。您可以创建表单的静态实例并以这种方式从父类访问它:class Parent{ public static Form myForm { get; set; } 然后从另一个类访问它:MyNameSpace.Parent.myForm.label1.Text = "some text"; 或者您可以像 Jon 在下面的答案中那样做类。
  • _SetlabelText() 在 Servers 类中,但它以 Main 形式调用。我只是想将方法移到另一个类中,所以我稍微收拾了一下。

标签: c# forms winforms class


【解决方案1】:

一种选择是在构造函数中存储对表单的引用,如下所示:

public class Servers
{
    private Form _frmMain;
    public Servers(Form frmMain)
    {
        _frmMain = frmMain;
    }
    public void SetlabelText()
    {
        _frmMain.label1.Text = "New Text";
    }
}

并像这样使用它:

public partial class Main : Form
{
    public Main()
    {
        InitializeComponent();
        var servers = new Servers(this);
        servers.SetlabelText();
    }
}

但是,通常建议返回到 Form 类并将其设置在那里,如下所示:

public partial class Main : Form
{
    public Main()
    {
        InitializeComponent();
        label1.Text = Servers.GetTextForLabel();
    }
}
public class Servers
{
    public static string GetTextForLabel()
    {
       return "New Text"; //(I assume this will be much more complex)
    }
}

【讨论】:

  • 为什么我似乎无法理解您的第一个示例。为什么它对我不起作用?我真的很困惑
  • @Maria 在上面添加了实现
  • 是的,但是那样 public void SetlabelText() { _frmMain.label1.Text = "New Text"; } 会抛出错误。 _frmMain.label1.Text 在类中不存在。你不能这样构建它。
  • @Maria 听起来你好像错过了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多