我有两个名为Form1
和Form2
的窗体。在Form2
的{{1}}控件中,我试图通过使用如下代码在两个表单之间传递值:
label1
但我收到此错误消息:
你能告诉我为什么会这样吗?'Form2.label1'由于其保护级别而无法访问
答案 0 :(得分:3)
Labell
将被声明为protected
或private
,这意味着其他类不可见。
因为它是自动生成的,所以你不应该将它的声明改为public
,所以你必须使用一个属性来设置值,或者创建第二个构造函数来传递标签的新值。 / p>
使用属性:
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();
答案 1 :(得分:3)
标签的可访问性级别太高。如果它是公开的,你只能访问它,我认为它是受保护的。
我会以映射到标签文本的形式提供公共属性。这比直接访问控件更具可读性和安全性。
public string LabelText
{
get {
return label1.Text;
}
set {
label1.Text = value;
}
}
现在您可以通过此属性获取/设置标签的文本:
Form2 frm = new Form2();
frm.LabelText = "Hello World";
frm.ShowDialog();
答案 2 :(得分:2)
在Form2中选择label1。接下来,在“属性窗格”(默认情况下右下角)中,将 Modifiers()属性更改为“公共”。
现在你可以做到:
frm.label1.Text = "Hello World!";
但是,这不是C#中的“正确”方法,或者通常是面向对象编程。请参阅其他答案,了解如何在属性中包装标签,或将值传递给Forms构造函数。
另外,在VB.Net IDE中,控件默认为Public,因此您可以按照预期访问“开箱即用”控件的Text属性,而无需进行任何更改。只是C#和VB.Net之间的许多细微差别之一...