请教C#的WinForm开发中窗口和窗口间怎么即时传递值?

accp009 2006-10-30 10:49:14
请教:
比如说,有窗口A和窗口B,窗口A上有1个TextBox和1个Button,窗口B上有1个DataGridView和1个Button.

我点窗口A的Button的时候,窗口B弹出(B.show),窗口B的DataGridView自动初始化一些值,比如初始化3行1列,分别为111、222、333.

我现在选种DataGridView其中一行,比如111这行,然后点窗口B的Button,窗口A的TextBox的Text即时变成111,应该怎么写啊?

我是用的C#做的,哪位大大给点解决的代码....
谢谢大家帮忙....
...全文
334 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liujia_0421 2006-10-31
  • 打赏
  • 举报
回复
看下愚翁大哥的这篇文章,应该对你很有帮助,几个月前,我也是从这篇文章得到的启发...
希望能对你有所帮助,如果还有问题,再交流....
http://blog.csdn.net/Knight94/archive/2006/08/22/1104957.aspx
minyskirt 2006-10-31
  • 打赏
  • 举报
回复
还有一个方法就是使用委托,采用命令模式来进行从B窗口的值显示在A窗口中
minyskirt 2006-10-31
  • 打赏
  • 举报
回复
给你一个例子,用委托的
窗口B:放一个button,一个listbox控件
生命一个委托和一个EventArgs
public delegate void ListBoxSelectEventHandler(object sender,ListBoxSelectEventArgs e);

public class ListBoxSelectEventArgs:EventArgs
{
private string mSelectValue;

public ListBoxSelectEventArgs(string selectValue)
{
mSelectValue = selectValue;
}

public string SelectValue
{
get
{
return mSelectValue;
}
}
}

在B的CS代码中定义以后实例:
private ListBoxSelectEventHandler listBoxSelect;
public virtual event ListBoxSelectEventHandler OnSelected
{
add {listBoxSelect += value;}
remove {listBoxSelect -= value;}
}

然后在B窗口的Button写一下代码:
private void button1_Click(object sender, System.EventArgs e)
{
if(listBoxSelect != null)
{
ListBoxSelectEventArgs eventArgs = new ListBoxSelectEventArgs(this.listBox1.Text);
listBoxSelect(this,eventArgs);
}
}

在A的button中写一下的代码:
private void button5_Click(object sender, System.EventArgs e)
{
B frm = new B();
frm.OnSelected +=new ListBoxSelectEventHandler(frm_OnSelected);
frm.Show();
}
再写一个委托的事件:
private void frm_OnSelected(object sender,ListBoxSelectEventArgs e)
{
textBox2.Text = e.SelectValue;
}
这样就能实现你的想要的效果了
zhouyinhui 2006-10-31
  • 打赏
  • 举报
回复
正解:

为窗口B写一个事件,比如叫做"DataGirdViewItemSelectedChanged".

在窗口A中为该事件注册处理函数

当在窗口B点击按钮时,引发该事件

窗口A接收到该事件,并做出响应
accp009 2006-10-31
  • 打赏
  • 举报
回复
liujia_0421() 谢谢你的帮助,但我是新手,不了解委托的用法,你有关于介绍委托的好网址或其他资料能告诉我下吗?谢谢了
accp009 2006-10-31
  • 打赏
  • 举报
回复
还有啊,声明了
public commodity_datum_add(string text)
{
InitializeComponent();
this.textBox4.Text = text;
}后,其他窗体再启动这个窗体的时候就必须得给他加参数了,这样一来,原来的即时传递就会因为有个参数而不发生改变了啊?这个怎么解决啊。
比如:原来其他窗体调用他的时候 Fom2 f2=new Fom2()
f2.show();

现在再调用:Fom2 f2=new Fom2("这里得写个值吧")
f2.show();
liujia_0421 2006-10-31
  • 打赏
  • 举报
回复
其实最好的方法就是委托,而且委托还比较安全...
liujia_0421 2006-10-31
  • 打赏
  • 举报
回复
TO:
可我在自己的项目里写的时候,这个this.textBoxFrm1.Text却是在this这死活点(.)不出来textBoxFrm1.....我已经新建立了两个窗体按照文章上的要求改了name添了控件......可却点不出来东西........

应该是你主窗体的问题...

你不作为参数,写在外面:

string str=this.textBoxFrm1.Text;
Form2 formChild = new Form2(str);

这样也不行?

diablo1003 2006-10-31
  • 打赏
  • 举报
回复
需要使用委托来实现
accp009 2006-10-31
  • 打赏
  • 举报
回复
zhzuo(秋枫)你好,我看了你给我的http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx,可在我使用的时候有一些问题....
按文章上写的 Form2 formChild = new Form2(this.textBoxFrm1.Text);

formChild.Show();
可我在自己的项目里写的时候,这个this.textBoxFrm1.Text却是在this这死活点(.)不出来textBoxFrm1.....我已经新建立了两个窗体按照文章上的要求改了name添了控件......可却点不出来东西........
liujia_0421 2006-10-30
  • 打赏
  • 举报
回复
两种方法:
1.传递窗体的指针(引用);
2.delegate(委托)方法来实现;

建议使用第二种方法..
ZiRRen 2006-10-30
  • 打赏
  • 举报
回复
在窗体A中声明一个属性:
private string textValue;

private string TextValue
{
get{return textValue;}
set{textValue=value;}
}

然后在B窗体中实例化一下实例化一下A:

A example=new A();
example.textValue=DataGrideView.SelectedValue;// 可能不是这样写,但是这个意思


然后A窗体中:TextBox.Text=textValue;就可以了.
灰太狼 2006-10-30
  • 打赏
  • 举报
回复
用delegate來做:
參見http://blog.csdn.net/tjvictor/archive/2006/06/23/824617.aspx第四個方法
yumanqing 2006-10-30
  • 打赏
  • 举报
回复
参见我的学习笔记,上面说的很详细
http://blog.csdn.net/yumanqing/
marvelstack 2006-10-30
  • 打赏
  • 举报
回复
在.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
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-30 10:49
社区公告

让您成为最强悍的C#开发者