Code Bye

怎么在继承自窗体类的子类中操作(最原始的)窗体控件?

上代码:

    public partial class Form1 : Form
    {
        public Form1(int code) { }

        public Form1()
        {
            InitializeComponent();
        }

        public class A : Form1
        {
            public A()// : base(0)
            {
                base.InitializeComponent();
            }

            public void B()
            {
                base.textBox1.Text = "changed";
                base.comboBox1.SelectedIndex = 0;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            new A().B();
        }
    }

注释掉的还有其他自己加的东西都是失败的尝试。
具体原因我知道是实例化 A 然后运行 B 方法时指向的是重新实例化过的窗体Form1。
我想知道有没有办法解决。
别问我具体的需求,我不知道仅仅是好奇或者是一种尝试,有空的有兴趣的高手随便解答下也行

2分

#1

在一个窗体类的后台 添加一个类,并调用其本身的InitializeComponent(),这太奇葩了。 楼主的好奇指数 实在太高了。
1分

#2

回复1楼:

你把 A中的  base.InitializeComponent  这个删掉测试

2分

#3

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public TextBox MyTb1
    {
        get
        {
            return this.textBox1;
        }
    }
}

public class A : Form1
{
    public void B()
    {
        this.MyTb1.Text = "changed";
    }
}
5分

#4

另外,显然你也可以写
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

public class A : Form1
{
    public void B()
    {
        this.textBox1.Text = "changed";
    }
}

但是你需要打开 textBox1 控件的“属性”窗,将 Modifier 属性改为 public。

#5

回复4楼:

我可能没说清楚。
事实是这样的:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            new A().B();
            MessageBox.Show("Form1.Handle: " + this.Handle.ToString());
        }
    }

    public class A : Form1
    {
        public void B()
        {
            //MessageBox.Show("A.Handle: " + this.Handle.ToString());
            MessageBox.Show("base.Handle: " + base.Handle.ToString());
        }
    }

获取到的窗体句柄是不同的,我估计是由于实例化 A 类的时候也调用了 Form1 的构造函数,所以 A 类中的 B 方法操作的并不是当前窗体的控件,而是另一个新窗体中的控件
但是我想验证这个猜想是不是正确时,在B方法中加了

this.Show();

之后却造成一直循环调用Form1和A类的情况,最后A中报错:创建窗体句柄失败。

2分

#6

回复5楼:

不要企图在form1里再实例化form1自身,会造成无限递归调用

3分

#7

还有,既然A : Form1
那么A中就已经含有Form1中的控件
只不过这些控件现在并不是属于Form1的,而是已经属于A的了,你操作A自己的控件就可以了

我不明白你所谓操作原始的控件是什么意思,原始的控件只不过相当于一个模板,根本没有实例化,没有对象,操作什么?

#8

回复7楼:

我是想在A类中操作控件然后在Form1里看到结果。
这么说的话一开始继承Form1就是错的了

5分

#9

    public partial class Form1 : Form
    {
        public Form1(int code) { }
 
        public Form1()
        {
            InitializeComponent();
        }
 
        public class A : Form1
        {
            //public A()
            //{
            //    base.InitializeComponent();
            //}
 
            public void B()
            {
                base.textBox1.Text = "changed";
                base.comboBox1.SelectedIndex = 0;
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //sender就是这个窗口
            A a = sender as A;
            if(a != null) a.B();
        }
    }

#10

回复9楼:

然而父类并不能强制转换为子类


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么在继承自窗体类的子类中操作(最原始的)窗体控件?