Form1中可以点按钮打开并传值给Form2,Form2中处理后关闭窗体又将结果回传给Form1该如何实现呢?
另外一个问题,一个登录窗体,登录后主窗体弹出,但是登录窗体不能关闭。原因在于登录窗体是程序的入口,一但关闭应用程序也随之关闭,需要在登录后关闭登录窗体,该如何实现?
请教高人解答,谢谢!

解决方案 »

  1.   

    Form2中处理后关闭窗体 ?   (窗体怎么关闭的?) NewForm.open()    //主窗体弹出
    this.close();     //登陆窗体关闭
      

  2.   

    Form1中可以点按钮打开并传值给Form2,Form2中处理后关闭窗体又将结果回传给Form1该如何实现呢?
    ----------
    这里所说的结果是什么样的结果?是指DialogResult么?
    那样就简单了
    Form2 form2 = new form2()if(form2.ShowDialog()==DialogResult.OK)
    {}
      

  3.   

    Form2手动关闭,将一个值回传给Form1,此过程中Form1一直未关闭。
    NewForm.open()    //主窗体弹出
    this.close();     //登陆窗体关闭
    结果应用程序也关闭了,因为登录窗体是程序的入口,但又需要第一个弹出
      

  4.   

    //也是传值
    CON-如何在子窗体(被调用者)中实现对其父窗体(调用者)的刷新呢?
    网络上有几种方法,先总结如下:
    调用窗体(父):Form1,被调用窗体(子):Form2
    方法1: 所有权法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //在调用Form2时,要把Form2的所有者设为Form1
    Form2 f2 = new Form2() ;
    f2.Owner = this;
    f2.ShowDialog() ;
    //Form2:
    //在需要对其调用者(父)刷新时
    Form1 f1 ;
    f1 = (Form1)this.Owner;
    f1.Refresh_Method() ;
    方法2:自身传递法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    Form2 f2 = new Form2() ;
    f2.ShowDialog(this) ;
    //Form2:
    private Form1 p_f1;
    public Form2(Form1 f1)
    {
    InitializeComponent();
    p_f1 = f1;
    }
    //刷新时
    p_f1.Refresh_Method() ;
    方法3:属性法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //调用时
    Form2 f2 = new Form2() ;
    f2.P_F1 = this;
    f2.Show() ;//Form2:
    private Form1 p_f1;
    public Form1 P_F1
    {
    get{return p_f1;}
    set{p_f1 = value;}
    }
    //刷新时
    p_f1.Refresh_Method() ;
    方法4:委托法
    //声明一个委托
    public delegate void DisplayUpdate();
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //调用时
    Form2 f2 = new Form2() ;
    f2.ShowUpdate += new DisplayUpdate(Refresh_Method) ;
    f2.Show() ;
    //Form2:
    //声明事件
    public event DisplayUpdate ShowUpdate;
    //刷新时,放在需要执行刷新的事件里
    ShowUpdate();
      

  5.   

    唉,说明白点,主窗体上放一个datagrid,还有个添加按钮,点添加后出现弹出添加窗体,输入值后将输入的值动态的在主窗体的datagrid中显示。
      

  6.   

    http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx
      

  7.   

    方法1:
    在Form1中
    Form2 form2 = new form2()
    this.Hide();
    if(form2.ShowDialog()==DialogResult.OK)
    {
        //处理内容
    }
    this.Dispose();//关闭Form1
    方法2:
    如果Form1不需要处理Form2的内容还可以把Form1传递给Form2
    修改Form2的构造函数,取得Form1的实例。
    Form1 form1 = null;Form2(Form1 f)
    {
        form1 = f;
    }
    在Form2.Dispose()中,
    {
        if(form1!=null)
        {
             form1.Close();
        }
    }
      

  8.   

    to 另外一个问题,一个登录窗体,登录后主窗体弹出,但是登录窗体不能关闭。原因在于登录窗体是程序的入口,一但关闭应用程序也随之关闭,需要在登录后关闭登录窗体,该如何实现?可以不讓登录窗体是程序的入口,就是在application.run( xxx )中寫上你的主窗體名字,可以這樣。if( login.Showdialog() == DialogResult.ok )
    {
         Application.run( new mainInterface() );
    }
      

  9.   

    楼上是一种常用的方法还有一种比较常见的方法是: 把登录窗体隐藏掉 this.hide(); 比较常见,资源上也没有差多少.
      

  10.   


    Form2里添加一个事件,例如: //添加一个事件
    Public delegate void OkEventHandler(object sender,EventArgs e );
    Public event OkEventHandler Ok;//触发事件(在你Form2要关闭时出发的事件 如:点击关闭铵钮时)
    private void Close_Click(object sender,EventArgs e )
    {
        if ( Ok != null )
           Ok("你要回传的参数",null);
        this.close();
    }
    Form1:    Form2 form2 = new Form2();
        //订阅Form2的事件,指定事件处理函数,例如:以下的process
        form2.Ok += new OkEventHandler(process);//Ok事件处理函数.当关闭Form2时接收回传的参数
    private void process(object sender,EventArgs e )
    {
        string xx =  (string)sender;
        MessageBox.Show( xx );
    }
      

  11.   

    双击datagrid传值写一个委托比较方便
      

  12.   

    lz:
       你不就是想“主窗体上放一个datagrid,还有个添加按钮,点添加后出现弹出添加窗体,输入值后将输入的值动态的在主窗体的datagrid中显示”吗?
       没有必要想得那么复杂,你原来怎么在主窗体显示datagrid的,就在主窗体的Activated事件再做一遍,当然最好把它写成一个函数,而且重新填充dataset,以方便调用。
       你想,按照你的想法,你关闭添加窗体之后,主窗体马上就回到激活状态,你加载的一定是最新的数据。
      

  13.   

    在.net中轻松掌握Windows窗体间的数据交互
    http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx
    窗体的参数传递
    http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx#sec5
      

  14.   

    TO:
    Form1中可以点按钮打开并传值给Form2,Form2中处理后关闭窗体又将结果回传给Form1该如何实现呢?参见:http://community.csdn.net/Expert/topic/5189/5189957.xml?temp=.7467462
      

  15.   

    在父窗体中
    子窗体 frmPath = new 子窗体(textBox3);
                frmPath.ShowDialog();在子窗体中
    private TextBox tb;
    public 子窗体(TextBox t)这是子窗体构造函数
            {
                InitializeComponent();
                textBox1.Text = t.Text;
                tb = t;
            }
     private void button1_Click(object sender, EventArgs e)
            {
               
                tb.Text = textBox1.Text;
                this.Close();
            }这样就可以把子窗体的数据传到父窗体中
      

  16.   

    这个问题有两种方法解决,一种是用多线程,另外一种是在第一个窗体上设一个静态的布尔变量,把main方法移到第二窗体,在第二窗体上写上
    static void Main() {
    Form1 f = new Form1();
    f.ShowDialog();
    if(Form1.Can == true) Can 为第一个窗体的静态的布尔变量,在第一个窗体判断成功后把Can 设为true
    {
     Application.Run(new mainForm());mainForm为第二个窗体名
    }
    }
      

  17.   

    窗体间传递数据,可以用一个静态的对象变量 例如:static Form f;
      

  18.   

    传值:
    public static string str;from1内代码:
    button_click(....)
    str=textbox1.text;
    from2 f2=new from2();
    from.show();
    this.hide();
    from2内代码:
    from1 f1=new from1();
    label1.text=f1.str;
    将from1中textbox1中的值传给from2中的label1.
      

  19.   

    以上的都不是很同意,虽然有的可以,但是,一般做C/S的是这样做的:
    在Form2中放一个属性
    public string DatagrId
    {
        get;
        set;
    }
    然后在Form1中 Show() Form2的时候给 DatagrId 赋值 然后关闭 Form2 在Form1 中就得到 DatagrId 了!然后在数据库中根据 DatagrId 查找内容 -> 填充 -> 然后 刷新自己 ->OK