我在form1中创建了一个textbox7,但是我希望以另一种形式访问它,表单2,所以我将其修饰符更改为public
当我进入form2时,我希望它执行以下操作
Form1.textBox7.ReadOnly = true;
但是我收到以下错误
错误1非静态字段需要对象引用, 方法或财产 'WindowsFormsApplication1.Form1.textBox7'C:\ Users \ Admin \ Google Drive \ AdminhomeGD \ ztese \ zprograma \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ formOpConfig.cs 73 46 WindowsFormsApplication1
我不知道出了什么问题
编辑:
我正在尝试在form1(名为Form1)上使用以下内容:
public Boolean gammamanual
{
get { return textBox7.ReadOnly; }
set { textBox7.ReadOnly = value; }
}
在form2上(名为formOpConfig):
namespace WindowsFormsApplication1
{
public partial class formOpConfig : Form
{
public formOpConfig(Form1 opener)
{
// this is a constructor
this.Opener = opener;
}
private Form1 Opener { get; set; }
public formOpConfig() { // initialization and stuff }
private void buttonExit_Click (object sender, EventArgs e)
{
if (checkBox3.Checked == true) { this.textBox7.gammamanual = false; }
else { this.textBox7.gammamanual = true; }
this.Hide();
}
我想要它,以便当复选checkbox3并退出form2时,textBox7将可以手动编辑。
编辑:2问题是form2是从form1启动的,同样,我在form2(formOpConfig)中有2个不同的构造函数。解决方案是使用
调整主构造函数 private Form1 Opener { get; set; }
public formOpConfig(Form1 opener)
{
this.Opener = opener;
InitializeComponent(); //Stuff
}
同时我能够使用
从Form1启动formOpConfigformOpConfig painelconfig = new formOpConfig(this);
painelconfig.ShowDialog();
答案 0 :(得分:5)
您无法通过类名访问实例变量,只有在它是静态的情况下才能工作。因此,您需要Form1
的实例来访问它的属性/字段。例如,您可以通过构造函数从Form1
传递给Form2
(如果Form1
实例化Form2
)或使用属性/方法。
但是,不是暴露完整的控制,我只提供必要的东西,称为Encapsulation。您可以使用有意义的名称公开一个公共属性,该名称描述textBox7
的目的(也更改此名称)。假设它的目的是显示属性可以是UserName
的用户名:
public partial class Form1 : Form
{
public string UserName
{
get{return TxtUserName.Text;}
set{ TxtUserName.Text = value;}
}
// ...
}
由于您想获取/设置ReadOnly
的{{1}}属性,您可以提供另一个属性:
TextBox
如果你有一个public bool UserNameEditable
{
get{ return !TxtUserName.ReadOnly; }
set{ TxtUserName.ReadOnly = !value; }
}
的实例,现在你可以从另一个Form
获取/设置它:
Form1
实例化时,需要将public partial class Form2 : Form
{
public Form2(Form1 opener)
{
// this is a constructor
this.Opener = opener;
}
private Form1 Opener { get; set; }
private void SomeMethod()
{
this.Opener.UserName = "Tim";
this.Opener.UserNameEditable = false;
}
// ...
}
实例传递给Form1
的构造函数。另一种方法是将属性Form2
公开,并使用那些不能确定它已被设置的缺点。
另一种方法是使用LINQ和Application.OpenForms
,它优雅但容易出错:
Opener
旁注:var form1 = Application.OpenForms.OfType<Form1>().FirstOrDefault();
form1.UserName = "Tim";
和Form1
也在为更有意义的名字而哭泣。
答案 1 :(得分:0)
您需要创建form1
个实例并创建一个公共属性,以便在form1
内设置控件。
public partial class Form2: Form
{
private Form1 objForm1;
public Form2(Form1 frm)
{
InitializeComponent();
//get other form
this.objForm1= frm;
//call here public property of form1 which set controls properties within form1
this.objForm1.SetReadOnly = true;
}
}
<强> Form1中强>
public partial class Form1 : Form
{
//setter Property
public bool SetReadOnly
{
set{ this.TextBox7.ReadOnly= value;}
get{ return this.TextBox7.ReadOnly;}
}
//Form1 Constructor
public Form1()
{
InitializeComponent();
}
//Form1 Load
private void Form1_Load(object sender, EventArgs e)
{
Form2 frm = new Form2(this);
frm.Show();
}
}
答案 2 :(得分:0)
在表单中,控件是使用私有访问修饰符创建的(请参阅设计器代码)。
private System.Windows.Forms.TextBox
因此,无法从其他表单访问这些控件。您应该做的是在表单上创建公共或内部属性。
public TextBox TextBox7 { get { return textBox7; } }
在Form2的(实例)中创建Form1的实例后,您可以访问此属性。
Form1 frm = new Form1();
frm.TextBox7.ReadOnly = true;