在form2中无法访问在form1中创建的公共textBox7

时间:2014-05-07 11:47:43

标签: c#

我在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启动formOpConfig
formOpConfig painelconfig = new formOpConfig(this);
        painelconfig.ShowDialog();

3 个答案:

答案 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;