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发生改变时,调用主窗体内声明的公共方法
}
我想问下,为什么会跳到这里? --------------------编程问答--------------------
--------------------编程问答--------------------
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;//可换成其它参数
}
}
那个是程序入口,退出的时候当然也会在那边出现了
至于为什么点击按钮会跳到那边,可能是BUG,或者是不是按钮事件发出程序退出命令了?有没那部分代码? --------------------编程问答-------------------- 简单点弄个静态的 --------------------编程问答-------------------- 还是没有出来。。 --------------------编程问答--------------------
再绝望地顶下。。 --------------------编程问答-------------------- 可以用委托。。。 --------------------编程问答--------------------
可以用委托。。。
悉听稍祥的解释。。谢谢 --------------------编程问答-------------------- 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#