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

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

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

有谁能解释一下为什么继承过来的某些控件不能在子窗体上直接修改属性(如dataGridView),而有些可以呢(如button),不要再说父窗体上控件的Modifiers属性了,我已经设置为protected了。
展开
 我来答
tiandwxgs
2011-03-12 · TA获得超过349个赞
知道答主
回答量:479
采纳率:100%
帮助的人:274万
展开全部

这个是我找的资料,你看看能帮上你不、具体网址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

guo9long
2013-06-20 · 超过45用户采纳过TA的回答
知道小有建树答主
回答量:166
采纳率:0%
帮助的人:91万
展开全部
经过测试, 父窗体上控件的Modifiers属性,已经设置为protected后,在子窗体上支持代码修改.属性窗口为灰色,不能直接修改.
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7ba3fcc41
2011-03-14
知道答主
回答量:16
采纳率:0%
帮助的人:25.9万
展开全部
如果可以修改父窗体,把父窗体里面的控件的可访问级别设为非private,如protected、internal、public等,则控件可以在子窗体中可以访问。否则,用运行时查找方式,如.Controls的方式或者是handle查找,找到相应控件进行操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小兰看动漫
2011-03-12 · TA获得超过134个赞
知道小有建树答主
回答量:234
采纳率:50%
帮助的人:102万
展开全部
用子窗体对象点就可以访问父窗体继承过来的控件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式