您好,请问一下,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
用子窗体对象点就可以访问父窗体继承过来的控件
相似回答