在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实例的其他字段可见?
答案 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
。要更改访问修饰符,您可以更改它,如下所示:
右键单击控件>属性>更改下拉列表,如下所示
我会将其更改为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>