Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何引用由设计工程师创建的对象_C#_Oop_Designer - Fatal编程技术网

C# 如何引用由设计工程师创建的对象

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

我正在使用默认的Visual Studio名称如何在form1.cs文件中的另一个自定义类中引用texbox objecttexbox1公共部分类form1:Form中的类

这是我的密码。在我的课堂上,我写了textBox1,但Intelissense没有向我推荐。我是说。在这种情况下,如何使texbox1在Intellience中显示?将form1.Desginer.cs中的private更改为public并不能解决这个问题。请回答

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