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不起作用。即使