有A,B,C,三个窗体,A上有个Button,B上有个panel,怎样才能实现点击Button的时候,把C加载到panel上呢?我现在的做法是,用一个专门类(ShowPanelForm)是实现将窗体加载在panel上的,当Button和panel是在统一窗体上的时候,就能将窗体加载到panel上,可是Button和panel不在同一窗体的时候,就不行了
class ShowPanelForm 
    { 
        public void Show(System.Windows.Forms.Panel panel,System.Windows.Forms.Form form) 
        { 
            panel.Controls.Clear(); 
          // InventoryManagement form = new InventoryManagement(); 
            foreach (System.Windows.Forms.Form ff in panel.Controls) 
            { 
                //如果子窗体存在,激活子窗体 
                if (ff.Name == form.Name) 
                { 
                    ff.Activate(); 
                    ff.Size = ff.Parent.Size; 
                    ff.WindowState = System.Windows.Forms.FormWindowState.Maximized; 
                    //((frmMain)parentWindow).s slblOperate.Text = ff.Text;                     return; 
                } 
            } 
            form.TopLevel = false; 
            panel.Controls.Add(form); 
            form.Show();         } 
    }

解决方案 »

  1.   

    貌似是窗体间通信问题,你就是在A窗体上不能控制B窗体上Panel上的的显隐
    用委托来做试试
      

  2.   

    或者你把 B窗体上的Panel封装一下在a窗体的button事件里控制b窗体Panel的情况
    Public myPanel
    {
       set{panel1=value};
       get{return panel1}
    }
    然后你在a窗体的button里就可以直接用它了
      

  3.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication297
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            Button B = new Button();
                B.Parent = this;
                B.Click += new EventHandler(B_Click);            new Form2().Show();
                new Form3().Show();
            }        void B_Click(object sender, EventArgs e)
            {
                Form F = Application.OpenForms["Form3"];
                F.TopLevel = false;
                F.Parent = Application.OpenForms["Form2"].Controls.Find("P", true)[0];
                F.Dock = DockStyle.Fill;
            }
        }    class Form2 : Form
        {
            public Form2()
            {
                this.Name = "Form2";            Panel P = new Panel();
                P.Parent = this;
                P.Name = "P";
                P.Dock = DockStyle.Fill;
                P.BackColor = Color.Black;
            }
        }    class Form3 : Form
        {
            public Form3()
            {
                this.Name = "Form3";
            }
        }
    }
      

  4.   

    可以的啊,估计是你添加窗体的那部分代码有问题,我试了可以的!        private void button1_Click(object sender, EventArgs e)
            {
                ShowPanelForm frm = new ShowPanelForm();
                Form2 frm2 = new Form2();
                //frm.Show(panel1, frm2);// OK
                Form3 frm3 = new Form3();
                frm2.Show();
                frm.Show(frm2.panel1, frm3);// OK
            }
      

  5.   

    private void button1_Click(object sender, EventArgs e)
            {
                ShowPanelForm frm = new ShowPanelForm();
                Form2 frm2 = new Form2();
                //frm.Show(panel1, frm2);// OK
                Form3 frm3 = new Form3();
                frm2.Show();
                frm.Show(frm2.panel1, frm3);// OK
            }
       
    可以!
      

  6.   

    你可以给窗口传值,来确定显示哪个。
            //Form1
            private void button1_Click(object sender, EventArgs e)
            {
                string filename = "test";
                Form2 f2 = new Form2(filename);
                f2.Show();
            }
            
            //Form2
            string filename;
            public Form2(string _filename)
            {
                InitializeComponent();            this.filename = _filename;
            }        private void Form2_Load(object sender, EventArgs e)
            {
                Form3 f3 = new Form3(filename);
                f3.TopLevel = false;
                f3.FormBorderStyle = FormBorderStyle.None;
                this.panel1.Controls.Add(f3);
                f3.Show();
            }        //Form3
            private string title;
            public Form3(string _title)
            {
                InitializeComponent();            title = _title;
            }        private void Form3_Load(object sender, EventArgs e)
            {
                this.label1.Text = title;
            }
      

  7.   

    可以为Form3的Panel定义一个属性,这样就可以在Form1里修改事先定义好的属性代码了
      

  8.   

     把ShowPanelForm显示C方法 写到B中 例如ShowForm(),在A中按钮事件下 Form B=New Form(); B.ShowForm(); B.Show();
    要注意ShowForm和Show的顺序啊 Show一定要在后面