2

Form1我有两个名为和的窗体Form2。在Form2's label1control 我试图通过使用这样的代码在两个 Forms 之间传递值:

Form2 frm = new Form2();
frm.label1.Text();
frm.ShowDialog();

但我收到此错误消息:

'Form2.label1' 由于其保护级别而无法访问

你能告诉我为什么会这样吗?

4

3 回答 3

3

Labell将被声明为protectedorprivate这意味着它对其他类不可见。

由于它是自动生成的,因此您不应真正将其声明更改为,public因此您必须使用属性来设置值或创建第二个构造函数来传递标签的新值。

要使用属性:

public string LabelValue
{
    get { return this.label1.Text; }
    set { this.label1.Text = value; }
}

然后:

Form2 frm = new Form2();
frm.LabelValue = "new string";
frm.ShowDialog();

要使用新的构造函数:

public Form2(string labelValue) : this()
{
    this.Label1.Text = labelValue;
}

然后使用它:

Form2 frm = new Form2("new string");
frm.ShowDialog();
于 2013-05-06T22:01:43.583 回答
3

标签的可访问性级别太高。如果它是公开的,您只能访问它,我认为它是受保护的。

看看访问修饰符

我会以映射到标签文本的形式提供一个公共属性。这比直接访问控件更具可读性和安全性。

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

现在您可以通过此属性获取/设置标签的文本:

Form2 frm = new Form2();
frm.LabelText = "Hello World";
frm.ShowDialog();
于 2013-05-06T22:02:38.573 回答
2

在 Form2 中选择 label1。接下来,在属性窗格中(默认为右下角),将Modifiers()属性更改为 Public。 Modifiers() 属性

现在你可以这样做:

frm.label1.Text = "Hello World!";

但是,这在 C# 中或者在一般的面向对象编程中不被认为是“正确”的方法。请参阅其他答案,了解如何将标签包装在属性中,或将值传递给 Forms 构造函数。

附带说明一下,VB.Net IDE 中的控件默认为 Public,因此您可以按照您的期望“开箱即用”访问控件的 Text 属性,而无需更改任何内容。只是 C# 和 VB.Net 之间的许多小区别之一......

于 2013-05-06T22:15:01.147 回答