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

runerback 2015-07-17 09:50:15
上代码:

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。
我想知道有没有办法解决。
别问我具体的需求,我不知道仅仅是好奇或者是一种尝试,有空的有兴趣的大神随便解答下也行
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
另外,显然你也可以写
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

public class A : Form1
{
    public void B()
    {
        this.textBox1.Text = "changed";
    }
}
但是你需要打开 textBox1 控件的“属性”窗,将 Modifier 属性改为 public。
  • 打赏
  • 举报
回复
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";
    }
}
exception92 2015-07-17
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
在一个窗体类的后台 添加一个类,并调用其本身的InitializeComponent(),这太奇葩了。 楼主的好奇指数 实在太高了。。
你把 A中的 base.InitializeComponent 这个删掉测试
exception92 2015-07-17
  • 打赏
  • 举报
回复
在一个窗体类的后台 添加一个类,并调用其本身的InitializeComponent(),这太奇葩了。 楼主的好奇指数 实在太高了。。
runerback 2015-07-17
  • 打赏
  • 举报
回复
引用 9 楼 shingoscar 的回复:
//sender就是这个窗口 A a = sender as A;} [/code]
然而父类并不能强制转换为子类
Poopaye 2015-07-17
  • 打赏
  • 举报
回复
    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();
        }
    }
runerback 2015-07-17
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
我不明白你所谓操作原始的控件是什么意思,原始的控件只不过相当于一个模板,根本没有实例化,没有对象,操作什么?
我是想在A类中操作控件然后在Form1里看到结果。 这么说的话一开始继承Form1就是错的了
於黾 2015-07-17
  • 打赏
  • 举报
回复
还有,既然A : Form1 那么A中就已经含有Form1中的控件了 只不过这些控件现在并不是属于Form1的,而是已经属于A的了,你操作A自己的控件就可以了 我不明白你所谓操作原始的控件是什么意思,原始的控件只不过相当于一个模板,根本没有实例化,没有对象,操作什么?
於黾 2015-07-17
  • 打赏
  • 举报
回复
引用 5 楼 shaoerbao 的回复:
[quote=引用 4 楼 sp1234 的回复:]
我可能没说清楚。 事实是这样的:

    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中报错:创建窗体句柄失败。[/quote] 不要企图在form1里再实例化form1自身,会造成无限递归调用
runerback 2015-07-17
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
我可能没说清楚。 事实是这样的:

    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中报错:创建窗体句柄失败。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧