C# 如何引用由设计工程师创建的对象
我正在使用默认的Visual Studio名称如何在form1.cs文件中的另一个自定义类中引用texbox objecttexbox1公共部分类form1:Form中的类 这是我的密码。在我的课堂上,我写了textBox1,但Intelissense没有向我推荐。我是说。在这种情况下,如何使texbox1在Intellience中显示?将form1.Desginer.cs中的private更改为public并不能解决这个问题。请回答C# 如何引用由设计工程师创建的对象,c#,oop,designer,C#,Oop,Designer,我正在使用默认的Visual Studio名称如何在form1.cs文件中的另一个自定义类中引用texbox objecttexbox1公共部分类form1:Form中的类 这是我的密码。在我的课堂上,我写了textBox1,但Intelissense没有向我推荐。我是说。在这种情况下,如何使texbox1在Intellience中显示?将form1.Desginer.cs中的private更改为public并不能解决这个问题。请回答 namespace Calculator { pub
namespace Calculator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
class myclass
{
textBox1
}
}
WinForms designer默认情况下使组件私有,理想情况下,您不应该直接公开控件等组件,因为它破坏了封装。您应该代理要共享的字段,如下所示:
public partial class MyForm : Form {
private TextBox _textbox1; // this field exists in the MyForm.designer.cs file
// this property should be in your MyForm.cs file
public String TextBox1Value {
get { return _textbox1.Text; }
set { _textbox1.Text = value; }
}
}
通过这种方式,您可以在表单之间共享数据,但也可以保持封装,尽管您应该选择比我选择的TextBox1Value更具描述性的名称。在嵌套类myclass中,您不指定所引用的Form1类的实例。添加对Form1特定实例的引用,然后您将能够访问其textBox1成员
通常,可以这样做:
class myclass
{
public myclass(Form1 owner)
{
if (owner == null) {
throw new ArgumentNullException("owner");
}
this.owner = owner;
}
private readonly Form1 owner;
public void DoSomething()
{
owner.textBox1.Text = "Hello, world!";
}
}
此代码使用在此类情况下使用的各种模式:
在构造函数中设置所有者,从而确保它从不为null
除此之外,构造函数将拒绝null
所有者成员是只读的,因此可以肯定地说,它在给定myclass实例的生存期内不会更改
在Form1的方法中,您可以通过调用new myclassthis创建链接到当前Form1实例的myclass实例。您不能在嵌套类中将其作为Form1类的一部分引用,您必须传入引用 例如:
class myclass
{
public TextBox MyTextBox { get; set; }
public MyClass(TextBox textbox)
{
MyTextBox = textbox;
}
}
然后在创建MyClass实例的Form1类中,您可以在文本框中传递
为什么myclass是MyForm的嵌套类?C嵌套类不像Java那样共享数据。@AbZy:可以说,另一个问题应该关闭,因为这个问题在某种程度上看起来更清楚。@O.R.Mapper我将其标记为重复,因为我们帮助重新打开了另一个问题,以便OP得到一些答案。再次发布这个问题是错误的。@AbZy:可能吧。另一个问题没有提到作者似乎有一个重要的约束,即文本框的声明不能更改,因为它是IDE生成的。这就是为什么我认为这个问题是一个更清晰的变体,它可能比创建顺序更重要。谢谢这个简单的例子。但是它给了我这个错误:不能访问外部类型的非静态成员……对,你需要先创建一个MyFrm实例。
MyClass myClass = new MyClass(this.textBox1);