您好,请问一下,C#子窗体如何访问从父窗体继承过来的控件?WinForm

可能我描述的不太清楚啊?我的目的是这样的:
在子窗体中选中一个从父窗体继承过来的控件,然后在属性窗口直接修改该控件的属性。

现在我这样做,把父窗体中的控件Modifiers属性值修改为protected,但我发现,从父窗体继承过来的button控件可以在子窗体中直接修改属性,但是dataGridView就不能在子窗体的属性窗口直接修改任何属性,因为所有属性值都是灰色的,无法修改。

有谁能解释一下为什么继承过来的某些控件不能在子窗体上直接修改属性(如dataGridView),而有些可以呢(如button),不要再说父窗体上控件的Modifiers属性了,我已经设置为protected了。

这个是我找的资料,你看看能帮上你不、具体网址http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx

说明:Form1为主窗体,包含控件:文本框textBoxFrm1,多选框checkBoxFrm1和按钮buttonEdit;  

Form2为子窗体,包含控件:文本框textBoxFrm2,多选框checkBoxFrm2和按钮buttonOK,buttonCancel。

当我们新建一个窗体的时候,设计器会生成默认的构造函数:  

public Form2()  

{  

 InitializeComponent();  

}  

它不带参数,既然我们要把Form1中的一些数据传到Form2中去,为什么不在Form2的构造函数里做文章呢? 

假设我们要实现使Form2中的文本框显示Form1里textBoxFrm1的值,修改子窗体的构造函数:  

public Form2(string text)  

     InitializeComponent();  

     this.textBoxFrm2.Text = text;  

}  

增加Form1中的修改按钮点击事件,处理函数如下:  

private void buttonEdit_Click(object sender, System.EventArgs e) 

      Form2 formChild = new Form2(this.textBoxFrm1.Text);  

     formChild.Show();  } 

我们把this.textBoxFrm1.Text作为参数传到子窗体构造函数,以非模式方式打开,这样打开的formChild的文本框就显示了”主窗体”文本,是不是很简单,接下来我们传一个boolean数据给子窗体。 

Public Form2(string text,bool checkedValue)  

{  

     InitializeComponent();  

    this.textBoxFrm2.Text = text;  

     this.checkBoxFrm2.Checked = checkedValue;  

}  

在主窗体中的修改按钮点击处理,我采用了打开模式窗口的方式,其实在这个例子中看不出有什么分别, 

private void buttonEdit_Click(object sender, System.EventArgs e) 

{  

     Form2 formChild = new Form2(this.textBoxFrm1.Text,this.checkBoxFrm1.Checked);  

     formChild.ShowDialog();  

}  

结果在预料之中,但是这里明显存在不足,在子窗体里的数据修改后不能传给主窗体,也就是说主窗体不受子窗体的影响。而在实际的开发过程中我们经常使用子窗体来修改主窗体里面的数据,那怎么解决呢?  

在.NET中有两种类型,值类型和引用类型。值类型是从ValueType继承而来,而ValueType又是从Object继承;对于引用类型它直接继承Object类型。这下让我们看看怎样通过Form2来修改Form1里的数据。 

还是让我们来修改Form2的代码。 

Private TextBox textBoxFrm12; 

private CheckBox checkBoxFrm12;  

public Form2(TextBox heckbo,CheckBox heckbox)  

     InitializeComponent();  

     this.textBoxFrm2.Text = heckbo.Text;  

     this.checkBoxFrm2.Checked = heckbox.Checked;  

      this.textBoxFrm12 = heckbo;  

    this.checkBoxFrm12 = heckbox;  

}  

现在我们传了两个引用类型的数据:TextBox类型,和CheckBox;另外在Form2中增加了两个类数据成员textBoxFrm12、checkBoxFrm12用来分别保存构造函数传来的变量,不过他们并不属于Form2的Controls容器。修改Form2的确定按钮点击事件函数:  

private void buttonOK_Click(object sender, System.EventArgs e)  

{  

  this.textBoxFrm12.Text = this.textBoxFrm2.Text;  

     this.checkBoxFrm12.Checked = this.checkBoxFrm2.Checked;  

this.Close();  }  

上面的代码我们通过把textBoxFrm2的Text和checkBoxFrm2.Checked赋给textBoxFrm12和checkBoxFrm12完成了对主窗体中的textBoxFrm1和checkBoxFrm2的修改,因为textBoxFrm1和textBoxFrm12是同一个引用,而checkBoxFrm2和checkBoxFrm12也是。  

到这里为止功能是实现了,但是总觉得不是很合理,让两个窗体控件传来传去,现在我举一个恰当一点的例子。  

修改了两个窗体:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-20
经过测试, 父窗体上控件的Modifiers属性,已经设置为protected后,在子窗体上支持代码修改.属性窗口为灰色,不能直接修改.本回答被提问者采纳
第2个回答  2011-03-14
如果可以修改父窗体,把父窗体里面的控件的可访问级别设为非private,如protected、internal、public等,则控件可以在子窗体中可以访问。否则,用运行时查找方式,如.Controls的方式或者是handle查找,找到相应控件进行操作。
第3个回答  2011-03-12
用子窗体对象点就可以访问父窗体继承过来的控件

子窗口如何调用父窗口中的信息,winform中子窗口如何调用父窗口的方法...
假设你的父窗体是mainForm,子窗体是childForm,保存文件的方法是SaveFile,你在父窗体中show子窗体的时候把父窗体对象传到子窗体里面,childForm cForm = new childForm(this); 这样你想在子窗体中的什么时候调用父窗体的保存文件方法都可以了。

C#窗体继承后,如何在子类窗体中修改父窗体中控件的事件?
你需要将父窗体的引用传到子窗体中,比如重载MergeForm2的构造函数,添加一个MergeForm1的参数,然后将子窗体的MergeForm1类变量指向这个引用。更改后MergeForm2部分代码如下:public partial class MergeForm2 : Form { \/\/声明一个MergeForm1引用 MergeForm1 Parent;...\/\/重载构造函数 public MergeForm...

C# winform怎么实现子窗体关闭时刷新父窗体数据
方法1:在子窗体的colsing事件中,调用父窗体的刷新方法;方法2:子窗体ShowDialog(),父窗体接收DialogResult.OK 时刷新;方法3:增加程序 协调员的角色,设计界面协调者 对象实现。

c# 子窗口控制父窗体的方法。和使用父窗口的控件,
_hand = hand; } private void button1_Click(object sender, EventArgs e) { _hand();\/\/调用父窗体中的方法 } }}使用委托相对要麻烦一点,你想简单的话,也可以直接将父窗体传递到子窗体去,像这样改下就行了 Form _form = null; \/\/将基类定义为子窗体的构造器参数 ...

C#如何在一个窗体中读取另一个窗体的控件的数据
我在Form1窗体中有个listView1控件,但我在edit这个窗体中想读取Form1窗体中listView1控件的内容,该如何实现?匿名 | 浏览2366 次 |举报 我有更好的答案推荐于2017-12-16 11:05:33 最佳答案 你在lform1设置全局变量这样:public static listview lv=new listview();这其他地方直接form1.lv就可以访问了。还有就...

c#子窗体控制父窗体的显隐
我们来实现这样一个功能:当父窗体打开一个子窗体时隐藏父窗体的Panel,而当子窗体关闭时让Panel显示。实现的主要思路是创建一个子窗体的父类并在类中声明一个委托,当父窗体调用子窗体时绑定显示Panel的方法。如下:1.新建一个项目,分别添加MainForm、BaseChildForm两个窗体,其中MainForm的IsMdiContainer...

C#子窗口 调用父窗口的变量
1.可以用构造函数,new子窗口的时候传过去。2.可以在父窗口定义为属性,子窗口里实例化父窗口可直接调用 402210313 | 发布于2013-04-07 举报| 评论 0 0 在子窗体中设置一个int变量,使用set get方法定义好。然后子啊父窗体中打开子窗体时把friendid 变量传递过去 13812991525 | 发布于2013-04-07 举报|...

C#子窗体关闭时怎么使父窗口中的控件也随之改变。
子窗体定义一个委托,父窗体实例化子窗体时注册子窗体的委托事件(具体方法实现父窗口的控件变化),子窗体关闭时调用事件方法。

C#中两个form窗体之间如何访问相互属性控件,如下:
方法一、利用属性传值 BackGround:①点击 Button按钮,将主窗体Form1中textBox1 中的值传到 Form2中的textBox2中。② 点击Form2中的按钮,将Form2中textBox的值传给主窗体的文本框。1、在Form2中定义一个字段,封装成属性:private string flag;\/\/\/ \/\/\/ 接收传过来的值 \/\/\/ public string...

语言C#.net 如何将子窗体嵌入到父窗体里面
1、设置父窗体:如果要将某个窗体设置为父窗体,只需将该窗体的IsMdiContainer属性设置为True即可。2、设置子窗体:通过设为某个窗体的MdiParent属性来确定该窗体是那个窗体的子窗体。语法如下:1: public Form MdiParent{get;set;} 3、排列MDI子窗体:语法如下:1: public void LayoutMdi(MdiLayout ...

相似回答