当前位置:编程学习 > C#/ASP.NET >>

C#实现点击一个按钮,弹出另一个窗口,在此窗口中输入的参数,保存至原窗口



如题,

现在要实现窗口1中有一个按钮,点击后弹出另一个窗口2,

在窗口2中用户输入一些参数,将这些参数保存并显示至窗口1中。


这该怎么实现?

首先实现点击一个按钮,弹出一个窗口的时候,

我定义了一个FORM2的窗口类,然后在窗口1的FORM1类里调用:



public class Form2 : Form
{

}

Form2这个类是在代码最底部定义的。

然后在Form1的的一个button里调用:

Form2 fm = new Form2();

fm.Show();


结果运行的时候,我一点击按钮,屏幕闪一下就直接退出程序了。

这是为什么? --------------------编程问答-------------------- 设置form2的父窗口。 --------------------编程问答--------------------
http://bbs.csdn.net/topics/360140208


快珍藏起来吧。 --------------------编程问答-------------------- 估计是form2在show的时候产生bug,导致程序崩溃了
另外你可以调用form2的showDialog方法,让用户完成交互 --------------------编程问答-------------------- delegate --------------------编程问答-------------------- event
在form2定义的关闭事件
然后在form1中写此事件+=
sender 和 e随便传参数。。 --------------------编程问答-------------------- 利用事件传值是最好的办法,给你的源代码,不懂在问我
http://blog.csdn.net/chaoyangzhixue/article/details/17162885 --------------------编程问答-------------------- 你在调用Form2的button那里设个断点一步一步的试试,看看是哪里错了 --------------------编程问答-------------------- 简单点静态变量就OK --------------------编程问答-------------------- 你的代码怎么会直接退出,是不是你Close了主窗口?

参考:
http://blog.csdn.net/wuyazhe/article/details/5642431 --------------------编程问答-------------------- 可参考一下这个。
http://blog.csdn.net/fosu_edu_cn/article/details/9451377 --------------------编程问答-------------------- 给个静态变量传值就行  虽然不太提倡用太多静态变量 --------------------编程问答-------------------- 事件委托吧 --------------------编程问答--------------------
我试了 fm.ShowDialog()也一样。。闪一下退出。

我单步调了,能执行到ShowDialog,也没报错,继续往下执行代码,但是没瞧见窗口。。 --------------------编程问答-------------------- 设了父窗口,也没用。

很奇怪,我发现form2有跳出来,但是就像透明的一样,跳出来一下程序就又退出了。 --------------------编程问答-------------------- 单步调之后发现,在程序退出之前,程序跳到program.cs中的这段代码:

        static void Main()
        {

            #region Api_CallCreateMutex;
            IntPtr hMutex;
            string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
           
            hMutex = CreateMutex(null, true, strAppName);
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                Application.Run(new Form1());
            }
            else  //程序跳到这个else里然后退出了。
            {
                MessageBox.Show("本程序只允许同时运行一个");
                ReleaseMutex(hMutex);
            }
            #endregion  
               
        
        }
--------------------编程问答--------------------   完美解决方案:
  写全局静态类,内容为form列表。

 示例如下:建两个窗体,form1(主窗体), form2

 建一个类Forms
	public static class Forms
{
public static Form1 f1;  //调用form1
public static Form2 f2;  //调用form2
}


 form1中放一个label, 一个buttons, 建一个公用接口
		public Form1()
{
InitializeComponent();
Forms.f1 = this;  //将静态列表中的f1挂接至form1
}

private void button1_Click(object sender, EventArgs e)
{
if (Forms.f2 == null || Forms.f2.IsDisposed) Forms.f2 = new Form2();  //如果form2未创建或已关闭则重新创建
Forms.f2.Show();  //显示form2
}

public void SetLabel(string s)  //用于你所说的窗口间传参数,不一定要是过程,只要是public就可以
{
this.label1.Text = s;
}


 form2中放一个textbox
		private void textBox1_TextChanged(object sender, EventArgs e)
{
Forms.f1.SetLabel(textBox1.Text);  //textbox发生改变时,调用主窗体内声明的公共方法
}
--------------------编程问答-------------------- 至此完美解决,结贴收分! --------------------编程问答--------------------
引用 15 楼 u012413894 的回复:
单步调之后发现,在程序退出之前,程序跳到program.cs中的这段代码:

        static void Main()
        {

            #region Api_CallCreateMutex;
            IntPtr hMutex;
            string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
           
            hMutex = CreateMutex(null, true, strAppName);
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                Application.Run(new Form1());
            }
            else  //程序跳到这个else里然后退出了。
            {
                MessageBox.Show("本程序只允许同时运行一个");
                ReleaseMutex(hMutex);
            }
            #endregion  
               
        
        }


我想问下,为什么会跳到这里? --------------------编程问答--------------------

Form2.cs       


   /// <summary>
        /// 要什么参数可以自己加
        /// </summary>
        public int Result { get; set; }
        /// <summary>
        /// 窗体2按钮单击关闭窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }


Form1.cs
     /// <summary>
        /// 窗体1按钮点击弹出Form2窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            if (f.ShowDialog() == DialogResult.OK)
            {
                int ret = f.Result;//可换成其它参数
            }
        }
--------------------编程问答--------------------
引用 18 楼 u012413894 的回复:
Quote: 引用 15 楼 u012413894 的回复:

单步调之后发现,在程序退出之前,程序跳到program.cs中的这段代码:

        static void Main()
        {

            #region Api_CallCreateMutex;
            IntPtr hMutex;
            string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
           
            hMutex = CreateMutex(null, true, strAppName);
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                Application.Run(new Form1());
            }
            else  //程序跳到这个else里然后退出了。
            {
                MessageBox.Show("本程序只允许同时运行一个");
                ReleaseMutex(hMutex);
            }
            #endregion  
               
        
        }


我想问下,为什么会跳到这里?

那个是程序入口,退出的时候当然也会在那边出现了

至于为什么点击按钮会跳到那边,可能是BUG,或者是不是按钮事件发出程序退出命令了?有没那部分代码? --------------------编程问答-------------------- 简单点弄个静态的 --------------------编程问答-------------------- 还是没有出来。。 --------------------编程问答--------------------
再绝望地顶下。。 --------------------编程问答-------------------- 可以用委托。。。 --------------------编程问答--------------------
引用 24 楼 sdzbxul 的回复:
可以用委托。。。


悉听稍祥的解释。。谢谢 --------------------编程问答-------------------- from2窗体
string Name;
        public Inset(string NAME)
        {
            InitializeComponent();
            Name = NAME;
        }
from1窗体
 Inset inset = new Inset(val);
            inset.ShowDialog();
val你要带的参数、
form1传几个   from2接收几个 --------------------编程问答-------------------- showDialog可以! --------------------编程问答-------------------- 在form2里面定义一个委托 然后再form1里面实例化form2的时候给哪个委托赋一个方法 如下
//委托也是一个类,所以直接写在namespace下面即可
//类型可以根据你要传递的参数来定义,不必object
public delegate void MyDelegate(object parameter);
public class Form2:Form
{
    MyDelegate myDelegate;
    //在关闭时间里面写
    private vodi Form2_Closing(object sender,EventArgs e)
    {
        object param;
        /*其他要用的方法以及给para赋值*/
        myDelegate(param);
    }
}
然后再Form1里面实例化Form2的时候
Form2 frm=new Form2();
frm.MyDelegate=MyFunction;
然后在Form1.cs里面定义一个MyFunction方法:
private void MyFunction(objcet param)
{
    /*这里的param就是你Form2里面设置的参数了,然后可以自己处理*/
}

在公司 没有VS的环境 大概就是这样了,可能有点小问题 你试了再说哈。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,