| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1121 人关注过本帖
标题:[求助]窗体的数据传递怎样传?
只看楼主 加入收藏
一直很安静
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-3-31
收藏
 问题点数:0 回复次数:9 
[求助]窗体的数据传递怎样传?
请问,如果我有一个form1

在form1里面点击一个按钮就可以调用一个form2

我怎样再把form2里面的数据传到form1里面去?

应该用什么方法吗?还是就是简单的参数传递?

问题是我的数据很多,很大,用参数的话不太方便;

比如:

我要实现一个查询功能,在form2里面有约束条件,要在form1

里面显示,怎么传这些数据呢?

十分感谢,请指教!!



搜索更多相关主题的帖子: 窗体 数据 
2006-03-31 18:43
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
收藏
得分:0 

2006-03-31 21:21
一直很安静
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-3-31
收藏
得分:0 

好的,谢谢,我再去看看!!


qq:33534255
2006-03-31 23:30
zhguyi321
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-4-27
收藏
得分:0 

方法有很多种,比如说,
form2
public type data

{

get

{

return data;

}

}

在form1 中

form2 fo2 = new form2()

type redata = fo2.data;(推荐)

第二种,

你可以定义一个类,在里面定义一个静态方法,通过这个静态方法作为桥梁!(可不推荐阿)

。。。。。。

2006-05-28 10:32
zklwzh
Rank: 2
等 级:论坛游民
帖 子:275
专家分:25
注 册:2005-11-16
收藏
得分:0 
如果要经常在窗体间传值的话,那就定义一个类。

2006-05-28 10:50
蓝色sky
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-6-3
收藏
得分:0 
我怎么看不懂
能不能说的详细点!

谢谢了

我是一个普通人 但,我比普通人更加努力!
2006-06-24 10:16
蓝色sky
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-6-3
收藏
得分:0 

构造函数


我是一个普通人 但,我比普通人更加努力!
2006-06-27 21:04
蓝色sky
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-6-3
收藏
得分:0 
Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集,它使您得以开发丰富的 Windows 应用程序。一个Windows窗体就代表了.NET架构里的System.Windows.Forms.Form类的一个实例。

作者在CSDN技术论坛.NET板块下的C#分类经常看到有人问起如何在两个Form间传递数据,访问修改对方窗体里面的值。对于有经验的程序员来说不是什么高深的东西,而对于初学者来说这些基础的东西往往是一个问题,并且存在这种现象,往往比较复杂的东西他们会,要用什么了就去学什么,实际上并没有真正的去理解掌握它,基础不扎实,所以就有了想通过自己对窗体编程积累的经验来写一些这方面的文章,以供学.NET的朋友参考,也借此机会同各位朋友进行交流,写得不合理的地方请各位朋友提宝贵意见,下面我分了三个部分来讲。

一.使用带参数的构造函数

我们要做的准备工作就是新建两个窗体,下面是两个窗体的布局,很简单:

<第一个例子>

说明:Form1为主窗体,包含控件:文本框textBoxFrm1,多选框checkBoxFrm1和按钮buttonEdit;

Form2为子窗体,包含控件:文本框textBoxFrm2,多选框checkBoxFrm2和按钮buttonOK,buttonCancel。

当我们新建一个窗体的时候,设计器会生成默认的构造函数:

public Form2()

{

InitializeComponent();

}

它不带参数,既然我们要把Form1中的一些数据传到Form2中去,为什么不在Form2的构造函数里做文章呢?

假设我们要实现使Form2中的文本框显示Form1里textBoxFrm1的值,修改子窗体的构造函数:

public Form2(string text)

{

InitializeComponent();

this.textBoxFrm2.Text = text;

}

增加Form1中的修改按钮点击事件,处理函数如下:

private void buttonEdit_Click(object sender, System.EventArgs e)

{

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

formChild.Show();

}

我们把this.textBoxFrm1.Text作为参数传到子窗体构造函数,以非模式方式打开,这样打开的formChild的文本框就显示了”主窗体”文本,是不是很简单,接下来我们传一个boolean数据给子窗体。

Public Form2(string text,bool checkedvalue)

{

InitializeComponent();

this.textBoxFrm2.Text = text;

this.checkBoxFrm2.Checked = checkedvalue;

}

在主窗体中的修改按钮点击处理,我采用了打开模式窗口的方式,其实在这个例子中看不出有什么分别,

private void buttonEdit_Click(object sender, System.EventArgs e)

{

Form2 formChild = new Form2(this.textBoxFrm1.Text,this.checkBoxFrm1.Checked);

formChild.ShowDialog();

}

结果在预料之中,但是这里明显存在不足,在子窗体里的数据修改后不能传给主窗体,也就是说主窗体不受子窗体的影响。而在实际的开发过程中我们经常使用子窗体来修改主窗体里面的数据,那怎么解决呢?

在.NET中有两种类型,值类型和引用类型。值类型是从valueType继承而来,而valueType又是从Object继承;对于引用类型它直接继承Object类型。这下让我们看看怎样通过Form2来修改Form1里的数据。

还是让我们来修改Form2的代码。

Private TextBox textBoxFrm12;

private CheckBox checkBoxFrm12;

public Form2(TextBox heckbo,CheckBox heckbox)

{

InitializeComponent();

this.textBoxFrm2.Text = heckbo.Text;

this.checkBoxFrm2.Checked = heckbox.Checked;

this.textBoxFrm12 = heckbo;

this.checkBoxFrm12 = heckbox;

}

现在我们传了两个引用类型的数据:TextBox类型,和CheckBox;另外在Form2中增加了两个类数据成员textBoxFrm12、checkBoxFrm12用来分别保存构造函数传来的变量,不过他们并不属于Form2的Controls容器。修改Form2的确定按钮点击事件函数:

private void buttonOK_Click(object sender, System.EventArgs e)

{

this.textBoxFrm12.Text = this.textBoxFrm2.Text;

this.checkBoxFrm12.Checked = this.checkBoxFrm2.Checked;

this.Close();

}

上面的代码我们通过把textBoxFrm2的Text和checkBoxFrm2.Checked赋给textBoxFrm12和checkBoxFrm12完成了对主窗体中的textBoxFrm1和checkBoxFrm2的修改,因为textBoxFrm1和textBoxFrm12是同一个引用,而checkBoxFrm2和checkBoxFrm12也是。

到这里为止功能是实现了,但是总觉得不是很合理,让两个窗体控件传来传去,现在我举一个恰当一点的例子。

修改了两个窗体:


我是一个普通人 但,我比普通人更加努力!
2006-06-27 21:09
蓝色sky
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-6-3
收藏
得分:0 
.net中轻松掌握Windows窗体间的数据交互

<第二个例子>

说明:在这个例子中我们的两个窗体都加了一个ListBox用来显示ArrayList中的内容。

主窗体中控件:listBoxFrm1,buttonEdit;

子窗体中控件:listBoxFrm2,textBoxAdd,buttonAdd,buttonEdit,buttonOK。

这次我们用ArrayList来作为传递数据,在Form1中定义类数据成员:

private ArrayList listData1;

在构造函数中增加了对listData1进行内存分配,并生成数据最终绑定到listBoxFrm1,

public Form1()

{

InitializeComponent();

this.listData1 = new ArrayList();

this.listData1.Add("DotNet");

this.listData1.Add("C#");

this.listData1.Add("Asp.net");

this.listData1.Add("WebService");

this.listData1.Add("XML");

this.listBoxFrm1.DataSource = this.listData1;

}

另外,对修改按钮点击事件处理函数的修改如下:

private void buttonEdit_Click(object sender, System.EventArgs e)

{

Form2 formChild = new Form2(this.listData1);

formChild.ShowDialog();

this.listBoxFrm1.DataSource = null;

this.listBoxFrm1.DataSource = this.listData1;

}

相对与主窗体,对子窗体作相应修改,也在Form2中增加了类数据成员:

private ArrayList listData2;

用来保存对主窗体中listData1的引用。

修改构造函数:

public Form2(ArrayList listData)

{

InitializeComponent();

this.listData2 = listData;

foreach(object o in this.listData2)

{

this.listBoxFrm2.Items.Add(o);

}

}

这里让listData2同listData1指向同一个引用;另外没有对listBoxFrm进行绑定,采用了填充。

好了,下面是对数据操作的时候了。

添加处理函数代码如下:

private void buttonAdd_Click(object sender, System.EventArgs e)

{

if(this.textBoxAdd.Text.Trim().Length>0)

{

this.listData2.Add(this.textBoxAdd.Text.Trim());

this.listBoxFrm2.Items.Add(this.textBoxAdd.Text.Trim());

}

else

MessageBox.Show("请输入添加的内容!");

}

删除处理代码如下:

private void buttonDel_Click(object sender, System.EventArgs e)

{

int index = this.listBoxFrm2.SelectedIndex;

if(index!=-1)

{

this.listData2.RemoveAt(index);

this.listBoxFrm2.Items.RemoveAt(index);

}

else

MessageBox.Show("请选择删除项或者没有可删除的项!");

}

退出Form2子窗体:

private void buttonOK_Click(object sender, System.EventArgs e)

{

this.Close();

}

编译运行程序,在子窗体中对数据进行修改,关闭后,主窗体就会显示更新后的数据。

我是一个普通人 但,我比普通人更加努力!
2006-06-27 21:12
蓝色sky
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-6-3
收藏
得分:0 

这里有一点要提醒一下,比较两个例子,我们都传的是引用类型,一个是String,另一个是ArrayList,为什么string类型不能修改主窗体的数据呢?其实在.Net中对string类型的修改并不是修改原来的值,原来的值没有变化,而是重新生成一个新的字符串,下面是一个很好的说明。

public class ZZConsole

{

[STAThread]

static void Main(string[] args)

{

string str1 = "abc";

string str2 = str1;

str1 = "123";

Console.WriteLine(str1);

Console.WriteLine("--------------");

Console.WriteLine(str2);

Console.WriteLine("--------------");

ArrayList al1 = new ArrayList();

al1.Add("abc");

ArrayList al2 = al1;

al2.Add("123");

foreach(object o in al1)

Console.WriteLine((string)o);

Console.WriteLine("--------------");

foreach(object o in al2)

Console.WriteLine((string)o);

Console.ReadLine();

}

}

运行一下看看输出结果就明白了,另外对值类型的数据操作要使用ref关键字。

总结,我们通过带参数的构造函数实现了窗体间的数据交互,代码看上去也比较清楚,在实际开发过程中,可以把DataSetDataTable,或者是DataView当作参数,当然如果只是想修改一行,可以传个DataRow或者DataRowView。在下面的文章中我们来看看怎样使用另外两种方法来实现数据的交互。

二.给窗体添加属性或方法

1.使用Form类的Owner属性

获取或设置拥有此窗体的窗体。若要使某窗体归另一个窗体所有,请为其 Owner 属性分配一个对将成为所有者的窗体的引用。当一个窗体归另一窗体所有时,它便随着所有者窗体最小化和关闭。例如,如果 Form2 归窗体 Form1 所有,则关闭或最小化 Form1 时,也会关闭或最小化 Form2。并且附属窗体从不显示在其所有者窗体后面。可以将附属窗体用于查找和替换窗口之类的窗口,当选定所有者窗体时,这些窗口不应消失。若要确定某父窗体拥有的窗体,请使用OwnedForms属性。

上面是SDK帮助文档上讲的,下面我们就来使用它。

首先还是使用第一篇文章中的第二个例子,窗体如下:

说明:在这个例子中我们的两个窗体都加了一个ListBox用来显示ArrayList中的内容。

主窗体中控件:listBoxFrm1buttonEdit

子窗体中控件:listBoxFrm2textBoxAddbuttonAddbuttonEditbuttonOK

主窗体中还是定义类数据成员,

private ArrayList listData1;

在构造函数里实例化它,填充数据,最后绑定到listBoxFrm1

构造函数如下:

public Form1()

{

InitializeComponent();

this.listData1 = new ArrayList();

this.listData1.Add("DotNet");

this.listData1.Add("C#");

this.listData1.Add("Asp.net");

this.listData1.Add("WebService");

this.listData1.Add("XML");

this.listBoxFrm1.DataSource = this.listData1;

}

主窗体的修改按钮处理函数:

private void buttonEdit_Click(object sender, System.EventArgs e)

{

Form2 formChild = new Form2();

formChild.Owner = this;

formChild.ShowDialog();

this.listBoxFrm1.DataSource = null;

this.listBoxFrm1.DataSource = this.listDa

}

[此贴子已经被作者于2006-6-27 21:14:04编辑过]


我是一个普通人 但,我比普通人更加努力!
2006-06-27 21:13
快速回复:[求助]窗体的数据传递怎样传?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025829 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved