C# 如何访问表单';类实例中的文本框?

C# 如何访问表单';类实例中的文本框?,c#,C#,在我的公共部分类frmMain:Form中,我有私有类磁贴 在类Tile中,我有private PictureBox pic=new PictureBox() 我已经为那些PictureBoxe注册了一个点击事件(在平铺类中): 单击图片框时,我希望能够看到textbox1.Text private void swap(object sender, EventArgs e) { // code here // if (won) { MessageBox.S

在我的
公共部分类frmMain:Form
中,我有
私有类磁贴

在类
Tile
中,我有
private PictureBox pic=new PictureBox()

我已经为那些PictureBoxe注册了一个点击事件(在
平铺
类中):

单击图片框时,我希望能够看到textbox1.Text

private void swap(object sender, EventArgs e)
{
    // code here //
    if (won)
    {
        MessageBox.Show(textBox1.Text);
    }
}
如何使frmMain实例的
textbox1.Text
和一些其他字段可见

如何使textbox1.Text和frmMain实例的其他一些字段可见

在C#windows窗体中,默认情况下控件是私有的。要更改访问修饰符,可以按如下方式进行更改:

右键单击“控件>属性”>“更改”下拉列表,如下所示

我会将其更改为
内部
,在您的情况下无需公开

这意味着控件所在的类(frmMain)之外的类可以访问该控件。但是您的内部类需要一个对
frmMain
的引用,以便它可以访问
frmMain
的控件。要做到这一点,您可以通过以下方式进行:

选项1

您可以将
frmMain
引用传递给构造函数中的类:

public class SomeClass
{
    private frmMain someForm;
    public SomeClass(frmMain someForm)
    {
        this.frmMain = someForm;
        // Now you can do this
        var ctrl = this.frmMain.WhateverControlYouNeedToAccess;
        string controlText = ctrl.Text; //assuming it has Text property
    }
}
在创建
SomeClass
期间,将表单传递给它:

// this reference to the current instance
// this code will be in your form
SomeClass some = new SomeClass(this); 
选项2

在您的类中有一个属性,因此它可以从外部设置,如下所示:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
您将按如下方式设置属性:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
选项3

只给班级最低限度的要求。您不需要给它一个对整个表单的引用,只需要给它一个(或多个)控件,然后像下面这样传递该控件:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
要使其工作,您的类需要具有上述属性。因此,您的类将具有如下属性:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
如何使textbox1.Text和frmMain实例的其他一些字段可见

在C#windows窗体中,默认情况下控件是私有的。要更改访问修饰符,可以按如下方式进行更改:

右键单击控件>属性>更改下拉列表,如下所示

我会将其更改为
内部
,在您的情况下无需公开

这意味着控件所在的类(frmMain)之外的类可以访问该控件。但是您的内部类需要一个对
frmMain
的引用,以便它可以访问
frmMain
的控件。要做到这一点,您可以通过以下方式进行:

选项1

您可以将
frmMain
引用传递给构造函数中的类:

public class SomeClass
{
    private frmMain someForm;
    public SomeClass(frmMain someForm)
    {
        this.frmMain = someForm;
        // Now you can do this
        var ctrl = this.frmMain.WhateverControlYouNeedToAccess;
        string controlText = ctrl.Text; //assuming it has Text property
    }
}
在创建
SomeClass
期间,将表单传递给它:

// this reference to the current instance
// this code will be in your form
SomeClass some = new SomeClass(this); 
选项2

在您的类中有一个属性,因此它可以从外部设置,如下所示:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
您将按如下方式设置属性:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
选项3

只给班级最低限度的要求。您不需要给它一个对整个表单的引用,只需要给它一个(或多个)控件,然后像下面这样传递该控件:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}
要使其工作,您的类需要具有上述属性。因此,您的类将具有如下属性:

public class SomeClass
{
    public frmMain SomeForm { get; set; }
}
SomeClass some = new SomeClass(); 
some.SomeForm = this;
SomeClass some = new SomeClass();
some.PictureBoxA = this.pictureBox1;
some.Button1 = this.button1;
public class SomeClass
{
    public PictureBox PictureBoxA { get; set; }
    public Button Button1 { get; set; }
}

最快的解决方案是将frmMain作为参数传递给Tile类。瓷砖等级为:

private class Tile {
     private frmMain frm;
     //constructor
     public Tile(frmMain frm) {
          this.frm = frm;
     }
     ... your code ... 
     //now you can
     private void swap(object sender, EventArgs e)
     {
          if (won)
          {
               MessageBox.Show(frm.textBox1.Text);
          }
     }
}
请记住,文本框1必须可从frmMain公开访问

最干净的解决方案是从frmMain公开接口,并将其作为参数传递给Tile类

接口

public interface IfrmMain_GetText
{
    string gettextBox1Text();
}
弗里曼

public partial class frmMain : Form, IfrmMain_GetText
{
      ... your code ...
      public string gettextBox1Text(){
           return textBox1.Text;
      }
}
瓷砖类

private class Tile {
         private IfrmMain_GetText frmInterface;
         //constructor
         public Tile(IfrmMain_GetText frmInterface) {
              this.frmInterface = frmInterface;
         }
         ... your code ... 
         //now you can
         private void swap(object sender, EventArgs e)
         {
              if (won)
              {
                   MessageBox.Show(frmInterface.gettextBox1Text());
              }
         }
    }

最快的解决方案是将frmMain作为参数传递给Tile类。瓷砖等级为:

private class Tile {
     private frmMain frm;
     //constructor
     public Tile(frmMain frm) {
          this.frm = frm;
     }
     ... your code ... 
     //now you can
     private void swap(object sender, EventArgs e)
     {
          if (won)
          {
               MessageBox.Show(frm.textBox1.Text);
          }
     }
}
请记住,文本框1必须可从frmMain公开访问

最干净的解决方案是从frmMain公开接口,并将其作为参数传递给Tile类

接口

public interface IfrmMain_GetText
{
    string gettextBox1Text();
}
弗里曼

public partial class frmMain : Form, IfrmMain_GetText
{
      ... your code ...
      public string gettextBox1Text(){
           return textBox1.Text;
      }
}
瓷砖类

private class Tile {
         private IfrmMain_GetText frmInterface;
         //constructor
         public Tile(IfrmMain_GetText frmInterface) {
              this.frmInterface = frmInterface;
         }
         ... your code ... 
         //now you can
         private void swap(object sender, EventArgs e)
         {
              if (won)
              {
                   MessageBox.Show(frmInterface.gettextBox1Text());
              }
         }
    }

您需要将表单引用传递给嵌套类。您可以通过构造函数来实现

private class Tile
{
    private frmMain _frm;

    public Tile (frmMain frm)
    {
        _frm = frm;
    }

    private void swap(object sender, EventArgs e)
    {
        if (won) {
            MessageBox.Show(_frm.textBox1.Text);
        }
    }
}
您需要将
textBox1
设置为公共,或者将其封装在公共属性中


更简洁的方法是将信息保存在数据类中,并使用对象绑定将其属性绑定到文本框。然后您可以将此数据对象传递给
平铺

参见:关于CodeProject


我不知道表单上显示了什么类型的数据,但是如果显示了平铺数据,那么
平铺
类可以充当数据类,您可以将平铺对象绑定到表单。

您需要将表单引用传递给嵌套类。您可以通过构造函数来实现

private class Tile
{
    private frmMain _frm;

    public Tile (frmMain frm)
    {
        _frm = frm;
    }

    private void swap(object sender, EventArgs e)
    {
        if (won) {
            MessageBox.Show(_frm.textBox1.Text);
        }
    }
}
您需要将
textBox1
设置为公共,或者将其封装在公共属性中


更简洁的方法是将信息保存在数据类中,并使用对象绑定将其属性绑定到文本框。然后您可以将此数据对象传递给
平铺

参见:关于CodeProject


我不知道表单上显示了什么类型的数据,但是如果显示了平铺数据,那么
平铺
类可以充当数据类,您可以将平铺对象绑定到表单。

您是否将textBox1控件的修改器更改为public?另外,您是否有frmMain或单例frmMain的静态实例?这样做应该行得通。当前,如果你把
MessageBox.Show(“一些消息”)在swap方法中,它是否显示带有消息“some message”的消息框?@ChetanRanpariya是。@Nathangrad都不起作用。您是否将textBox1控件的修饰符更改为public?另外,您是否有frmMain或单例frmMain的静态实例?这样做应该行得通。当前,如果你把
MessageBox.Show(“一些消息”)在swap方法中,它是否显示带有消息“some message”的消息框?@ChetanRanpariya是。@Nathangrad不起作用。即使