C#自定义类中如何获取主窗口的控件引用
把问题简化叙述下。我在窗体中拖了一个textBox,命名为“textBox1”。现在我想在一个自己写的类(Class1.cs)里面获取这个textBox控件,我该怎么做?...
把问题简化叙述下。
我在窗体中拖了一个textBox,命名为“textBox1”。现在我想在一个自己写的类(Class1.cs)里面获取这个textBox控件,我该怎么做?
这些方法我都尝试过:
1.在主窗口中声明一个属性为public的textBox对象(设名字为“publicTextBox”),并把textBox1的引用传进去,其他的类通过引用form1.publicTextBox来引用它
结果:这个做法严重破坏了程序的封装性,而且由于混乱的引用,常常导致连环的引用以致程序出错
2.在Class1中声明一个为public的Control对象(设名字为“publicControl”),在主类里面把自己(this)传进去
结果:失败了,publicControl.textBox1程序报错,说不存在
3.在Class1地构造函数中主类的引用传进去
结果:同第二个,也失败了
我觉得,在资源中,我可以通过一个绝对的地址引用到程序的资源(如“global::WindowsApplication1.Properties.Resources;”)。那么有没有一种方法可以引用到主窗口的控件呢?
或者,我的第二个尝试,是不是不能通过“publicControl.textBox1”来进行调用,而是应该借用其他的方法?
求高手指点,谢谢 展开
我在窗体中拖了一个textBox,命名为“textBox1”。现在我想在一个自己写的类(Class1.cs)里面获取这个textBox控件,我该怎么做?
这些方法我都尝试过:
1.在主窗口中声明一个属性为public的textBox对象(设名字为“publicTextBox”),并把textBox1的引用传进去,其他的类通过引用form1.publicTextBox来引用它
结果:这个做法严重破坏了程序的封装性,而且由于混乱的引用,常常导致连环的引用以致程序出错
2.在Class1中声明一个为public的Control对象(设名字为“publicControl”),在主类里面把自己(this)传进去
结果:失败了,publicControl.textBox1程序报错,说不存在
3.在Class1地构造函数中主类的引用传进去
结果:同第二个,也失败了
我觉得,在资源中,我可以通过一个绝对的地址引用到程序的资源(如“global::WindowsApplication1.Properties.Resources;”)。那么有没有一种方法可以引用到主窗口的控件呢?
或者,我的第二个尝试,是不是不能通过“publicControl.textBox1”来进行调用,而是应该借用其他的方法?
求高手指点,谢谢 展开
3个回答
展开全部
global::WindowsApplication1.Properties.Resources是通过一个绝对的地址引用到程序的资源文件,是文件。控件是什么?其实就是一段代码的封装,再加上显示样式,不是资源文件,所以我觉得应该找不到。
您有3中方法,我十分赞成第一种,其余不是太懂,晕晕的。
原因:窗体其实也是一个类,控件只不过是类中的一个全局成员罢了,而且还是私有的(这跟我们平常写的普通类是一样的,全局成员私有,用属性去访问或修改它)。
所以我建议在窗口类中构造该控件的属性方法。其中有两种属性方法
1、为该控件构建一个控件属性
public TextBox myTextBox
{
get { return textBox1;}
}
这种方法,会透漏textbox的所有属性,不够安全。
2、只构造自己想用的属性,比如text属性
public string myTextString
{
set {textBox1.Text=value;}//如果只想获取Text,set就不用写了
get {return textBox1.Text;}
}
这样既方便,安全性也高,完全没必要考虑(结果:这个做法严重破坏了程序的封装性),想想一般类都是属性访问和设置私有成员的
您有3中方法,我十分赞成第一种,其余不是太懂,晕晕的。
原因:窗体其实也是一个类,控件只不过是类中的一个全局成员罢了,而且还是私有的(这跟我们平常写的普通类是一样的,全局成员私有,用属性去访问或修改它)。
所以我建议在窗口类中构造该控件的属性方法。其中有两种属性方法
1、为该控件构建一个控件属性
public TextBox myTextBox
{
get { return textBox1;}
}
这种方法,会透漏textbox的所有属性,不够安全。
2、只构造自己想用的属性,比如text属性
public string myTextString
{
set {textBox1.Text=value;}//如果只想获取Text,set就不用写了
get {return textBox1.Text;}
}
这样既方便,安全性也高,完全没必要考虑(结果:这个做法严重破坏了程序的封装性),想想一般类都是属性访问和设置私有成员的
展开全部
winform窗体是分部定义的,窗体类的定义中有partial修饰符修饰,窗体设计器的代码和逻辑代码共同构成一个可视化控件(control类型),展开解决方案资源管理器中窗体图标,能够看见设计器的代码(若窗体名为form1,则逻辑代码位于form1.cs而设计器代码位于form1.designer.cs)。设计器代码包含控件的声明,这些声明均使用private修饰,是设计器自动生成的代码(因为在设计器中拖放,因此代码自动生成,并且不建议编辑)。若要在窗体外部直接使用某控件,可修改form1.designer.cs中的代码,但要注意当使用设计器将此控件修改后,修饰符可能被重置为private(因为代码是自动生成的)。
追问
这个方法我也尝试过,但是仍然没有办法从外部引到这个空间,也许正如您所说,修饰符被重置为private了。
追答
你不妨放一段代码上来,我看看你想怎么用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用你第二种方法就行了啊。。。
publicControl.textBox1
把这个改下,,,
改成
(publicControl as 你那个窗口类的名字,一般是Form1之类的).textBox1
publicControl.textBox1
把这个改下,,,
改成
(publicControl as 你那个窗口类的名字,一般是Form1之类的).textBox1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询