C# winform程序设计中,我如何实现两个窗体间的数据传值?效果像Windows系统查找页面一样...请教高手 我要在主窗体中点击一个按钮,然后弹出一个子窗体,在子窗体中输入数据后,主窗体如何获取数据,并根据获取的数据,在主窗体上进行相应的操作? 极度迷茫啊... 望指教...头一次发帖,所以分数没多少,还望高手指教.. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用属性啊.主窗体frmMain 在显示frm的事件里:frm f1=new frm(); f1.show();f1.str就可以取出子窗体的控件值;最后再f1=null;子窗体:frm 有一个btnOk按钮;public string str;在关闭子窗体的事件里:this.Hide()//一定要隐藏,f1.str就没值了;str=TextBox1.Text public string getForm1() { return this.textBox1.Text; } private void About_Load(object sender, EventArgs e) { rcode r=new rcode(); this.label1.Text = r.getForm1(); }也可以到designer.cs中把要传的东西改成public 楼主是不是这个意思:1、在form2中传进个值然后在from1中拿到这个值?2、另外你拿到这个数据后进行相应的操作是什么意思?不大明白!要是1的话你可以这样做:在form2中定义一个公有的静态变量,输入那个数据后把那个值赋给这个静态变量。然后在form1中拿到这个值。要是满足你的需求的话,把分给了哈,哥们穷死拉! :) 哎!我要的效果是像windows CTRL+F 查找的实现,大家可以按CTRL+F然后出来查找界面,大家可以试试.因为他是在查找的内容是在主窗体上,因此我点查找下一个的时候,就要在主窗体中查找内容,如果查到的话就要把他标识出来,就是这样的一个效果,请问大家有解决的方法吗?我想可能要用到委托和事件把?可是目前我对事件不是很明白,希望大家给个正确的思路和方法''谢谢!分数不多,但是解决了一定加分..呵呵 最近刚好做了一个这样的查询基类窗体,给段代码给楼主看看~父窗体。 /// <summary> /// 点击查询菜单项。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void miFind_Click(object sender, EventArgs e) { RowLocater f = new RowLocater(dgGrid); f.Show(); }子窗体。 /// <summary> /// 实例化一个查询窗体。 /// 注意将TopMost属性设为true。 /// </summary> /// <param name="Grid"></param> public RowLocater(DataGridView Grid) { InitializeComponent(); DataGridView = Grid; cmbMatchType.SelectedIndex = 1; }/// <summary> /// 点击查询按钮。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAccept_Click(object sender, EventArgs e) { bool hasFind = false; if (dg.CurrentRow == null) return; int beginIndex = dg.CurrentRow.Index; int i = beginIndex + 1; while (i != beginIndex) { if (i > dg.Rows.Count - 1) { i = 0; hasFind = FindKey(i); if (hasFind) break; else continue; } hasFind = FindKey(i); if (hasFind) break; i++; } if (!hasFind) { MessageBox.Show("搜索完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } 在主窗体中将frmSecond fs =new frmSecond(string name,string id);fs.Show();在另一个窗体中的构造函数中接收这几个参数就行了 CON-如何在子窗体(被调用者)中实现对其父窗体(调用者)的刷新呢?网络上有几种方法,先总结如下:调用窗体(父):Form1,被调用窗体(子):Form2方法1: 所有权法//Form1://需要有一个公共的刷新方法public void Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2 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(); 这种问题太多了,baidu下大把的! 子窗体上:public delegate void ChildFormSendMessage(string a,bool b);public ChildFormSendMessage btnSaveClick;private btnSave_Click(object sender,EventArgs e){if(btnSaveClick!=null){btnSaveClick(this.txtBoxName.Text,This.chkBoxIsNew.Checked);}}父窗体上 ChildForm c=new ChildForm();c.btnSaveClick+=new ChildFormSendMessage(process);c.show();private void process(string a, bool b){....} Ctrl+F 查找对话框是点击查找按钮就发生一个事件,主窗体定制此事件,在发生此事件后主窗体从对话框获取值(可以用属性,或自定义事件参数,将需要的值放在参数中),然后主窗体中执行查询。Main:private void OpenDialog(){ CustomeDialog cd = new CustomeDialog(); cd.CustomeEventHandle += new EventHandler(cd_CustomeEventHandler); cd.show();}private void cd_CustomeEventHandler(object sender, EventArgs e){ string needValue = (sender as CustomeDialog).CustomProperty;//从对话框获取需要的值, //这样其他的编写就简单了 }Dialog:属性:public string CustomProperty{ get{return xx;}}定义事件:public event EventHandler CustomeEventHandler;需要执行的按钮事件:private void Click(object sender, EventArgs e){ this.xx = textBox1.text; if(null != CustomeEventHandler) { CustomeEventHandler(this, EventArgs.Empty);//EventArgs可以自定义,这里从属性获取值,所以事件参数为空 } //this.close();//如果需要关闭此对话框加上这句} 你可以在csdn下载我的习题,搜索xuxiang19840814资源多窗体的应用即可 前两天我自己刚刚琢磨出来怎么做,现在总算对事件有一个初步的了解了,解决方法和jason_mf 的比较接近,唉,总算告一段落了,顺便问一下大家,怎么结贴啊........? 进入你的帖子,左上角有个“管理帖子”按钮,进入然后在右边的分数栏里给分,然后在1楼上边有个输入密码框,输入密码点“结帖”就ok了。给点分啊楼主,哥们穷人啊,hoho... 悬赏100分!关于使用委托与异步调用,顶者有分!顺便大家也来学习下吧 从资源文件获取指定大小图标 C#初学者问个关于数据源的问题 C# 回车事件问题? 关于打印的奇怪问题 各种卡上的卡号是通过VC(VB、汇编等)程序写上去的,还是用特别的设备写到卡上的?还是卡出厂时就带有的。 关于params参数的传递! 100分求助!C#经典入门书籍! 鼠标 在 picturebox 上拖动图片的问题 datalist完全不显示数据,而且已存入指定目录的图片在数据库中找不到图片路径 求助:自定义一个类似combobox控件遇到的问题??? 数据库连接超时值
f1.str就可以取出子窗体的控件值;最后再f1=null;子窗体:frm 有一个btnOk按钮;public string str;
在关闭子窗体的事件里:this.Hide()//一定要隐藏,f1.str就没值了;str=TextBox1.Text
{
return this.textBox1.Text;
}
private void About_Load(object sender, EventArgs e)
{
rcode r=new rcode();
this.label1.Text = r.getForm1();
}也可以到designer.cs中把要传的东西改成public
要是1的话你可以这样做:
在form2中定义一个公有的静态变量,输入那个数据后把那个值赋给这个静态变量。
然后在form1中拿到这个值。
要是满足你的需求的话,把分给了哈,哥们穷死拉! :)
父窗体。 /// <summary>
/// 点击查询菜单项。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void miFind_Click(object sender, EventArgs e)
{
RowLocater f = new RowLocater(dgGrid);
f.Show();
}
子窗体。 /// <summary>
/// 实例化一个查询窗体。
/// 注意将TopMost属性设为true。
/// </summary>
/// <param name="Grid"></param>
public RowLocater(DataGridView Grid)
{
InitializeComponent();
DataGridView = Grid;
cmbMatchType.SelectedIndex = 1;
}
/// <summary>
/// 点击查询按钮。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAccept_Click(object sender, EventArgs e)
{
bool hasFind = false;
if (dg.CurrentRow == null) return;
int beginIndex = dg.CurrentRow.Index;
int i = beginIndex + 1;
while (i != beginIndex)
{
if (i > dg.Rows.Count - 1)
{
i = 0;
hasFind = FindKey(i);
if (hasFind)
break;
else
continue;
}
hasFind = FindKey(i);
if (hasFind) break;
i++;
} if (!hasFind)
{
MessageBox.Show("搜索完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
将frmSecond fs =new frmSecond(string name,string id);
fs.Show();在另一个窗体中的构造函数中接收这几个参数就行了
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();
public delegate void ChildFormSendMessage(string a,bool b);
public ChildFormSendMessage btnSaveClick;private btnSave_Click(object sender,EventArgs e)
{
if(btnSaveClick!=null)
{
btnSaveClick(this.txtBoxName.Text,This.chkBoxIsNew.Checked);
}
}父窗体上
ChildForm c=new ChildForm();
c.btnSaveClick+=new ChildFormSendMessage(process);
c.show();
private void process(string a, bool b)
{
....
}
private void OpenDialog()
{
CustomeDialog cd = new CustomeDialog();
cd.CustomeEventHandle += new EventHandler(cd_CustomeEventHandler); cd.show();
}private void cd_CustomeEventHandler(object sender, EventArgs e)
{
string needValue = (sender as CustomeDialog).CustomProperty;//从对话框获取需要的值,
//这样其他的编写就简单了
}Dialog:
属性:
public string CustomProperty
{
get{return xx;}
}
定义事件:public event EventHandler CustomeEventHandler;需要执行的按钮事件:
private void Click(object sender, EventArgs e)
{
this.xx = textBox1.text;
if(null != CustomeEventHandler)
{
CustomeEventHandler(this, EventArgs.Empty);//EventArgs可以自定义,这里从属性获取值,所以事件参数为空
} //this.close();//如果需要关闭此对话框加上这句
}