如何从类的实例访问Form的文本框?

时间:2017-06-11 15:21:01

标签: c#

public partial class frmMain : Form内{我有private class Tile

在课程Tile内,我有private PictureBox pic = new PictureBox();

我已经为那些pictureBox(在Tile类内)注册了一个click事件:

public void Initialize()
{
    pic.Click += new EventHandler(swap);
}

当我点击pictureBox时,我希望能够看到textbox1.Text。

private void swap(object sender, EventArgs e)
{
    // code here //
    if (won)
    {
        MessageBox.Show(textBox1.Text);
    }
}

如何让textbox1.Text和我的frmMain实例的其他字段可见?

3 个答案:

答案 0 :(得分:2)

最快的解决方案是将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);
          }
     }
}

请记住textBox1必须可以从frmMain公开访问。

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

接口

public interface IfrmMain_GetText
{
    string gettextBox1Text();
}

frmMain

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());
              }
         }
    }

答案 1 :(得分:1)

  

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

在C#窗体中,默认情况下控件为private。要更改访问修饰符,您可以更改它,如下所示:

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

enter image description here

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

这意味着控件所在的类之外的类(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;

选项3

只给予课程所需的最低限度。你不需要给它一个整个表单的引用,但只需要一个控件(或更多),然后专门传递控件:

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; }
}

答案 2 :(得分:1)

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

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或将其封装在公共财产中。

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

请参阅CodeProject上的A Detailed Data Binding Tutorial

我不知道您的表单上显示的是哪种数据,但是如果显示了tile数据,那么Tile类可以充当数据类,您可以将tile对象绑定到表单。 / p>