原先是做Web开发的,刚开始试着用vs2005作winform程序开发。
问题1:在MDI(多文档)中,假设有主窗体frmMain和form1、form2两个子窗体,两个子窗体上各有一个Button。点击frmMain中主菜单的某个菜单项后打开了form1子窗体,现在想点击form1中的button将form1先隐藏不显示,然后显示form2,点击form2上面的Button关闭form2再显示出form1来,应该如何编码?
问题2:点击form1上的button能否在打开form2的同时向form2传值?同样的,在关闭form2的同时能否也向form1传值?
谢谢各位指教我。

解决方案 »

  1.   

    传值
    改变控件的可访问属性 (public)
    在显示窗体前需要创建窗体对象 比如
    Form2 f2= new Form2(); 
    f2.控件名称.text="";
    f2.ShowDialog();this.控件.text=f2.控件名称.text;//传回来
    f2.Dispose();//关闭对象在f2的关闭前先隐藏对象
    this.Hide();
      

  2.   

    问题2:
    在form2中重载构造函数,如下:private string _orderid = "";public ucStockIn(string orderid)
    {
        InitializeComponent();
        _orderid = orderid;
    }
    点击form1上的button时新建form2的对象,并往form2的构造函数中传入值。string orderid = "001";
    ucStockIn mStockIn = new ucStockIn(orderid);
      

  3.   

    Web的窗口和winform窗口还是有很大区别的,web的窗口打开都是从服务器下载新的网页,所以要考虑状态,那些变量是否丢失winform的窗口没有这么多问题,随时都可以访问,只要类没有关闭第一个问题就简单的设置隐含和显示属性或者调用隐含和显示方法就可以了
      

  4.   

    问题1:在MDI(多文档)中,假设有主窗体frmMain和form1、form2两个子窗体,两个子窗体上各有一个Button。点击frmMain中主菜单的某个菜单项后打开了form1子窗体,现在想点击form1中的button将form1先隐藏不显示,然后显示form2,点击form2上面的Button关闭form2再显示出form1来,应该如何编码? 
    ==
    构造form2时把form1的引用传过去,点击form2上面的Button是form1.Show()
      

  5.   

    关闭form2时可以通过句柄向form1传值://取消
    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
    }//确认
    private void btnAccept_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.OK;
    }
      

  6.   

    点击form1上的button能否在打开form2的同时向form2传值?
    ==
    一般通过构造函数传递窗体引用同样的,在关闭form2的同时能否也向form1传值?
    ==
    不规范的做法是将form1的控件属性设为public,就可以随意访问;规范点给form1一些public的属性返回或设置这些值
      

  7.   

    1.在主窗体frmMain中加入如下代码:        private Form1 form1 = null;
            private Form2 form2 = null;        public Form1 Form1
            {
                get
                {
                    return form1;
                }
                set
                {
                    form1 = value;                if (form1 != null)
                    {
                        form1.MdiParent = this;
                    }
                }
            }        public Form2 Form2
            {
                get
                {
                    return form2;
                }
                set
                {
                    form2 = value;                if (form2 != null)
                    {
                        form2.MdiParent = this;
                    }
                }
            }在主窗体frmMain某菜单单击事件中添加如下代码:        private void menuFileOpen_Click(object sender, EventArgs e)
            {
                if (Form1 == null)
                {
                    Form1 = new Form1();
                }            Form1.Show();
            }2.在Form1中按钮单击事件中添加如下代码:        private void buttonOK_Click(object sender, EventArgs e)
            {
                this.Hide();            frmMain parent = MdiParent as frmMain;
                if (parent != null)
                {
                    if (parent.Form2 == null)
                    {
                        parent.Form2 = new Form2();
                    }                parent.Form2.Text = "从Form1传入的参数";    //这里加入要传入的参数
                    parent.Form2.Show();
                }
            }3.在Form2的按钮单击事件中加入如下代码:        private void buttonOK_Click(object sender, EventArgs e)
            {
                this.Hide();            frmMain parent = MdiParent as frmMain;
                if (parent != null)
                {
                    if (parent.Form1 == null)
                    {
                        parent.Form1 = new Form1();
                    }                parent.Form1.Text = "从Form2传入的参数";    //这里加入要传入的参数
                    parent.Form1.Show();
                }
            }
      

  8.   

    问题一:frmMain-->form1-->form2
    在frmMain中的跳转到form1的按钮中写
    Form1 f1= new Form1(); 
    f1.Show();         //这是非模式的窗体,用这种方式还可以对其它窗体进行操作
    或f1.ShowDialog(); //这是模式化的窗体,当打开这个窗体后必须对这个窗体执行相关的操作
    this.Hide();       //隐藏当前窗体
    f1.Dispose();      //关闭当前窗体
    你要的跳转可以类似的这样做
    问题二:你说的那种情况当然是可以的
    首先你要先把两个窗体建立联系,即在form1中可调用form2中的文字或者某个控件
    代码:
    在form1中
    Form2 f2= new Form2();
    f2.Owner=this;
    f1.Show();
    this.Hide();
    f1.Dispose();
    在Form2中
    Form1 f1=(Form1)this.Owner;
    这样的话就可以在关闭Form1后但是Form1中的控件的在Form2中可以调用的到了
    例如在Form1中有个Lable1你想在Form2中调用给textBox1,在写完上面的代码后你就可以继续在Form2中写
    this.textBox1.Text=f1.Lable1.Text;
    在Form2回到Form1窗体中也就是将上面的代码反过来即可
    ********归根你的两个问题还是一个问题,只要问题二中的代码就可以全部解决了
    OK,到此了
      

  9.   

    问题一:
        主窗体是可以访问form1和form2的,利用事件机制,
            当点击主窗体菜单时位于主窗体中的事件处理函数创建form1,
            当点击form1中的按钮时位于form1中的事件处理程序激发form1中的自定义事件"打开form2"
            主窗体中事件"打开form2"的处理函数执行,隐藏form1,创建form2
            当点击form2中的按钮时,位于form2中的事件处理函数激发form2的自定义事件"显示form1"
            位于主窗体的事件处理程序处理"显示form1"事件,执行关闭form2,显示form1的动作
      说明:默认的button控件是私有的,但是可以用public开放,这样就不用在form中自定义事件了,主窗体直接编写button的点击事件处理函数.
    问题二:
        可以传值,也是利用事件机制:
       1.自定义一套事件,以便于传送自定义的参数类型.
      像这样
           delegate void 打卡form2(object sender, 自定义参数 args);
           event 打卡form2 on打卡form2;
      

  10.   

    这样的..点form1的按钮时你就要触发form2.也就是要经过form2的构造方法.然后你在Form2窗体的构造方法就可以写为Form1 form1;
    public Form2(Form1 form1)
    {
    this.form1 = form1;
    }
    这样就可以直接操作form1里面的属性呀,方法什么的.FORM1同样写为一样..
      

  11.   

    在form1窗体调用的时候要..Form2 form2 = new Form2(this);要这样写,把本身传过去.
      

  12.   

    在form1上的button上写this.Hide();
    if(form2.ShowDialog=== DialogResult.Cancel)
    {
       this.Show();
    }
      

  13.   

    对于问题二,楼主可以使用接口,使form1承继于该接口,在form2初始化的时候将该接口作为参数传递,那么你在form2中对接口的操作实际上就是对form1的数据操作,那么一致性就有保证,并且不用传来传去那么麻烦了
      

  14.   


    1,form1上加个命名为"隐藏"的按钮,
    设置它的Visible属性(true/false)
    例如:button1.Visible=false;//隐藏,但实例数据状态依然被保存,
    当你:
    button1.Visible=true;//时它原样显现出来.2,所谓传值,就是这样的设你的MDI主窗口为:form1,有两个子窗口subf1,subf2它们都被包含在form1之中如果你想往子窗口中加入自定义值,那么你应该先,让子窗口继承Form基类然后在在其中设计时添加你所期的字段比如 string address; int number;等等并让它们可以被包含它们 的类(这里是form1)所访问到,那么你可以大致这样传值,例如:...//在form1内部的构造函数中订阅子窗口的事件
    subf2.Click+=this.subf2_Click;
    ...//事件应答设计
    void subf2_Click(object sender,EventArgs e)
    {
      //向subf1传值:
      this.subf1.Address=this.subf2.Address;//subf2中的Address比如被一个TextBox.Text的值所赋予
      //...
    }
      

  15.   

    1,form1上加个命名为"隐藏"的按钮, 
    设置它的Visible属性(true/false) 
    例如: button1.Visible=false;//隐藏,但实例数据状态依然被保存, 
    当你: 
    button1.Visible=true;//时它原样显现出来.
    //晕了,写错了,对不起加上一个命名"隐藏"的按钮当点击它时写入:设两个子窗口分别为subf1,subf2this.Visible=false;//在子窗口(subf1)内部的Click事件应答函数中this.subf1.Visible=true;//在主窗口里的另一个子窗口的Click事件应答函数中
      

  16.   

    就是找HANDLE 只要存到公共的一个上义域里就可以传递
      

  17.   

    呵呵,上面都说得很明白了,
    第一个问题通过.ShowDialog()和.Hide()就可以了
    第二个问题上面的方法也可以,
    你也可以定义一个窗体的属性来传值,
    或使用窗体自带的.Tag属性来传值
      

  18.   

    可以使用form,button的属性来做吧。利用Visible
    当你做完一个事件,就想做什么事
    ShowDialog()这个方法是在当前页面弹出一个新窗口,此窗口不被关闭时其他窗口都不能用,Show()则可以用
    Hide()就是一个隐藏控件的方法,为false显示,反之隐藏