在主窗体Panel中添加新的窗体(C#,winform开发) 设置收藏文的要写的是如何将窗体(Form)添加到panel中。
为什么要这样呢?1)如果用tab控件,整个窗体的控件太多,不易于我们编程;2)可以更灵活的控制窗体的布局。
我想你一定看过这样的配制信息窗体吧(迅雷的配置页面)。
在你的项目开发中,是否也希望做出这种效果呢?应该如何设置呢?单击窗体的左边的按钮,窗体右边的内容会根据单击的按钮变化.开始是想到的设置思路很简单,主窗体(如上图),右边放置一个Panel控件. 然后根据单击的按钮将子窗体显示在Panel控件上.在按钮的单击事件中加入下面的代码:在按钮的单击事件中加入下面的代码:private void button1_Click(object sender, EventArgs e){ChildForm child = new ChildForm();this.panel1.Controls.Add(child);child.Show();}运行程序显示“不能将顶级控件添加到一个控件上”出现“不能将顶级控件添加到一个控件上”错误怎么处理?在代码中加入child.TopLevel = false;OK.新问题又出现了.我们不希望子窗体的标题和边筐也显示在父窗体中,再添加如下代码.child.FormBorderStyle = FormBorderStyle.None;现在的感觉是不是舒服多了.但是还隐藏着一个新问题.怎样动态设置子窗体的Size、Location等呢?我希望在调整父窗体大小时,Panel1 中子窗体的大小也跟随动态自动调整 .需要加入下面的事件private void panel1_Resize(object sender, System.EventArgs e){try{this.child.ClientSize = newSystem.Drawing.Size(panel1.Size.Width, panel1.Size.Height);}catch(System.Exception Er){MessageBox.Show(Er.ToString());}}编译无错,执行时(Error: 未将对象引用设置到对象的实例)但连续点了4个一样的错误提示确认后,程序却可以正常执行,并且form1调整窗体大小form2也可以随之响应了。
此计不行,又生一计.我们可以把子窗体当成一个控件,设置Dock属性不就行了吗?赶快测试一下:private void button1_Click(object sender, EventArgs e){ChildForm child = new ChildForm();child.TopLevel = false;child.Dock = System.Windows.Forms.DockStyle.Fill;child.FormBorderStyle = FormBorderStyle.None;//child.Parent = this.panel1;this.panel1.Controls.Add(child);child.Show();}WinForm中子父窗体传值子窗体向父窗体传值以及父窗体向子窗体传值Code1:所有权法//Form1://需要有一个公共的刷新方法public void Refresh_Method(){//}//在调用Form2时,要把Form2的所有者设为Form1Form2 f2 = new Form2() ;f2.Owner = this;f2.ShowDialog() ;//Form2://在需要对其调用者(父)刷新时Form1 f1 ;f1 = (Form1)this.Owner;f1.Refresh_Method() ;eg:Form1中的函数:public void DiaoYong(string str){this.textBox1.Text =str;}private void button2_Click(object sender, EventArgs e) {string str = this.textBox1.Text;Form2 f2 = new Form2(str);//在构造函数中,向子窗体传值。
f2.Owner = this;f2.ShowDialog();}Form2中的函数:public Form2(string ss){InitializeComponent();this.textBox1.Text = ss;}private void button1_Click(object sender, EventArgs e){string st = textBox1.Text;Form1 f1;f1 = (Form1)this.Owner;f1.DiaoYong(st);this.Close();}2009-12-01主窗口子窗口之间的调用在项目中用到了这个东西,c#基础有点弱,只有百度了这里引用过来觉得挺好/freeliver54/archive/2009/02/11/1388173.html 具体内容如下:本次示例效果如下:Form1为父窗体(包含textBox1、button1)Form2为子窗体(包含textBox2、button2)父窗体给子窗体传值==================1.点击Form1的button1 打开Form2父窗体给子窗体传值可以调用重载子窗体的构造函数直接传入相关数值public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Form2 frm2 = new Form2(this.textBox1.Text);frm2.Show();}}public partial class Form2 : Form{public Form2(){InitializeComponent();}public Form2(string strTextBox1Text){InitializeComponent();this.textBox2.Text = strTextBox1Text;}}2.点击Form1的button1 打开Form2并调用子窗体Form2的公开属性或方法将Form1的textBox1的值设置给Form2的textBox2public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {Form2 frm2 = new Form2();frm2.TextBox2Text = this.textBox1.Text;frm2.Show();}}public partial class Form2 : Form{public Form2(){InitializeComponent();}public string TextBox2Text{set { this.textBox2.Text = value; }get { return this.textBox2.Text; }}}3.点击Form1的button1 打开Form2在Form2_Load调用父窗体Form1的公开属性或方法将Form1的textBox1的值设置给Form2的textBox2public partial class Form1 : Form{public Form1(){InitializeComponent();}public string TextBox1Text{set { this.textBox1.Text = value; }get { return this.textBox1.Text; }}private void button1_Click(object sender, EventArgs e){Form2 frm2 = new Form2();frm2.Show(this);//或 frm2.ShowDialog(this);////或者//Form2 frm2 = new Form2();//frm2.Owner = this;//frm2.Show();//或 frm2.ShowDialog();}}public partial class Form2 : Form{public Form2(){InitializeComponent();}private void Form2_Load(object sender, EventArgs e){Form1 frm1 = (Form1)this.Owner;this.textBox2.Text = frm1.TextBox1Text;}}子窗体给父窗体传值==================4.点击Form1的button1 打开Form2再点击Form2的button2在button2_Click事件中通过this.Owner将Form2的textBox2的值设置给Form1的textBox1并关闭Form2public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Form2 frm2 = new Form2();frm2.Show(this);//或 frm2.ShowDialog(this);////或者//Form2 frm2 = new Form2();//frm2.Owner = this;//frm2.Show();//或 frm2.ShowDialog();}}public partial class Form2 : Form{public Form2(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){Form1 frm1 = (Form1)this.Owner;//注意如果textBox1是放在panel1中的则先找panel1 再找textBox1 ((TextBox)frm1.Controls["textBox1"]).Text =this.textBox2.Text;this.Close();}}5.点击Form1的button1 打开Form2再点击Form2的button2在button2_Click事件中通过this.Owner及调用父窗体Form1的公开属性或方法将Form2的textBox2的值设置给Form1的textBox1并关闭Form2public partial class Form1 : Form{public Form1(){InitializeComponent();}public string TextBox1Text{set { this.textBox1.Text = value; }get { return this.textBox1.Text; }}private void button1_Click(object sender, EventArgs e){Form2 frm2 = new Form2();frm2.Show(this);//或 frm2.ShowDialog(this);////或者//Form2 frm2 = new Form2();//frm2.Owner = this;//frm2.Show();//或 frm2.ShowDialog();}}public partial class Form2 : Form{public Form2(){InitializeComponent();}private void button2_Click(object sender, EventArgs e) {Form1 frm1 = (Form1)this.Owner;frm1.TextBox1Text = this.textBox2.Text;this.Close();}}我的使用是:在form1中private void button6_Click(object sender, EventArgs e){Form2 listViewReatin = new Form2();ListView listView1 = listViewReatin.listView1;listViewReatin.Owner = this;readTxt(@"\Storage Card\address.txt", listView1); listViewReatin.Show();}在form2中private void button4_Click(object sender, EventArgs e){int i = listView1.SelectedIndices[0];string s = listView1.Items[i].SubItems[1].Text;// MessageBox.Show(s);//实现子传父类注意关闭自己Form1 f1 = (Form1)this.Owner;f1.textBox1.Text = s;f1.webBrowser1.Navigate(new Uri(s));this.Close();}应用程序开发中,经常需要多窗体之间进行数据通信,写几个例子,把几种常用的通信方式总结一下:主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是TextBox,显示选中的该列的文本,另一个是按钮,点击时将修改后的值回传,且在Form1中修改相应的列的文本,同时Form2关闭。