总结C中窗体间传递数据的几种方法.docx

上传人:b****2 文档编号:17670792 上传时间:2023-07-27 格式:DOCX 页数:11 大小:17.76KB
下载 相关 举报
总结C中窗体间传递数据的几种方法.docx_第1页
第1页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第2页
第2页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第3页
第3页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第4页
第4页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第5页
第5页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第6页
第6页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第7页
第7页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第8页
第8页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第9页
第9页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第10页
第10页 / 共11页
总结C中窗体间传递数据的几种方法.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

总结C中窗体间传递数据的几种方法.docx

《总结C中窗体间传递数据的几种方法.docx》由会员分享,可在线阅读,更多相关《总结C中窗体间传递数据的几种方法.docx(11页珍藏版)》请在冰点文库上搜索。

总结C中窗体间传递数据的几种方法.docx

总结C中窗体间传递数据的几种方法

在编写C#windows应用程序的时候我们经常会遇到这种问题,怎么样在两个窗体间传递数据呢

以下是我整理的网上的各种方法,在遇到一个实际问题:

在forml中打开一个form2窗口作为录

入界面,将录入的值经转换后在forml中显示。

采用了委托的方法,可以实现。

(与VC的回调

的应用相似)

1•可以通过委托的方法来解决

问题:

通过forml做一个录入界面,将里边通过文本框录入的数值复值给form2中的listview

各列,用3个举例吧,分别对应listview的3个列。

可以这么做,如果两个窗体是在同一个命名空间下

定义一个代理,注意这个代理是全局的:

(即同一命名空间下,与Forml,Form2平级的)

publicdelegatevoidMylnvoke(stringItem1,stringItem2,stringItem3);

Item2);

[-1].(Item3);

}

.);

(this);

然后将Form1的构造函数改成可以接收几个参数的就行了。

2.假如主框架为Form1,打开的搜索对话框是Form2.直接在Form2类中申明一个Form1实例:

Form1f仁newForm1();然后就可以通过f1来调用Form1中的域和函数了。

其实不是这样的,你申明的新的Form1实例不是原来的那个Form1对象了,这样操作的是新的Form1中的域和函数,

和最先打开的Form1是没有关系的。

我们要做的是把当前的Form1实例传递给Form2,如果是这样的话,问题就很好解决了。

方法1:

首先,我们在Form2中定义:

privateFormlmF_Form

我们更改Form2的构造函数为有参数的

publicForm2(FormlmyForm)

{

2f2flfMainltem2);

[-1].(ltem3);

}

.);

(this);

然后将Form1的构造函数改成可以接收几个参数的就行了。

2.假如主框架为Form1,打开的搜索对话框是Form2.直接在Form2类中申明一个Form1实例:

Form1f仁newForm1();然后就可以通过f1来调用Form1中的域和函数了。

其实不是这样的,你申明的新的Form1实例不是原来的那个Form1对象了,这样操作的是新的Form1中的域和函数,

和最先打开的Form1是没有关系的。

我们要做的是把当前的Form1实例传递给Form2,如果是这样的话,问题就很好解决了。

方法1:

首先,我们在Form2中定义:

privateForm1mF_Form

我们更改Form2的构造函数为有参数的

publicForm2(Form1myForm)

{

//

//Windows窗体设计器支持所必需的

//

InitializeComponent();

=myForm;/////这样在Forml中申明Form2的时候就把Forml的实例传递过来了

//

//TODO:

在InitializeComponent调用后添加任何构造函数代码

//

}

在Forml中,我在要用到Form2的地方申明如下:

Form2f2=newForm2(this);//〃这里的this指的就是Forml当前的实例,也就是把当前Forml

的实例通过Form2的构造函数传递给Form2类(其实在网上看到过比较蠢的方式,就是在构造函

数里面传递要传递的信息如:

字符串或是数字等,这样做很有局限性,不能传递其他的,所有我

们可以直接传递实例,来完成传递更多的信息。

这样在Form2中使用myForm就可以对原来的Form1窗口进行操作了。

但是你要把要操作的Form1

中的域和函数定义成public形式的(这样可能不安全),此时的myForm就是真正的最开始打开

的Form1了,你可以用这个实例来进行两个窗体的通讯了。

()

3•其实C#中提供了窗体间进行通讯的现成的属性,呵呵,我们能想到的,微软也想到了,他们创造的语言其实确实可以说是人性化了。

在Form1类中申明Form2时用如下代码:

Form2f2=newForm2();//////类Form2中的构造函数不改,还是无参的

=this;////这里的this指的是类Form1当前的实例。

//也可以使用函数的方法,给当前实例添加一个附属窗口代码:

(f2);

在Form2类的定义中写如下代码:

Form1f1=;

这样f1对应的就是原来的Form1的实例了,也就可以用这个进行通讯了。

但是还是要把不同类

之间访问的域和函数定义成public,哎,安全确实是一个问题!

4•使用静态类

这个也是我们经常要用到的一种数据交互方法。

下面是定义的一个类:

usingSystem;

using;

namespaceZZ

{

publicclassAppDatas

{

privatestaticArrayListlistData;

staticAppDatas()

{

listData=newArrayList();

("DotNet");

("C#");

("");

("WebService");

("XML");

}

publicstaticArrayListListData

{

get{returnlistData;}

}

publicstaticArrayListGetListData()

{

returnlistData;

}

上面包含了一个静态类成员,listData,—个静态构造函数staticAppDatas(),用来初始化

listData的数据。

还有一个静态属性ListData和一个静态GetListData()方法,他们实现了同

样的功能就是返回listData。

由于前面两篇文章已经讲了很多,这里不细说了,下面是完整的代码:

文件

usingSystem;

using;

using;

using;

usingZZ

{

publicclassForml:

{

privatebuttonEdit;

privatelistBoxFrml;

privatecomponents=null;

publicForm1()

{

InitializeComponent();

一}

}

protectedoverridevoidDispose(booldisposing)

{

if(disposing)

if(components!

=null)

();

(disposing);

}

[STAThread]

staticvoidMain()

{

(newForm1());

}

privatevoidInitializeComponent()

{

=new=new();

=new108);

="buttonEdit";

=1;

="修改";

+=new;

=12;

=new8);

="listBoxFrm1";

=new124);

=2;

=new14);

=new141);

="Form1";

="Form1";

(false);

privatevoidbuttonEdit_Click(objectsender,e){

Form2formChild=newForm2();

();

=null;

一}

}

}

}

文件

using;

using;

using;

usingZZ

{

publicclassForm2:

{

privatebuttonOK;

privatecomponents=null;

privatelistBoxFrm2;

privatebuttonAdd;

privatebuttonDel;

privatetextBoxAdd;

publicForm2()

InitializeComponent();

foreach(objectoin

}

protectedoverridevoidDispose(booldisposing)

{

if(disposing)

if(components!

=null)

();

(disposing);

}

privatevoidInitializeComponent()

{

=new=new=new=new=new();

=new108);

="buttonOK";

=0;

="确定";

+=new;

=12;

=new8);

="listBoxFrm2";

=new124);

=2;

=new44);

="buttonAdd";

="增加";

+=new;

=new76);

="buttonDel";

=4;

="删除";

+=new;

=new12);

="textBoxAdd";

=new21);

=5;

一Illi.

=new14);

=new141);

="Form2";

="Form2";

(false);

}

privatevoidbuttonOK_Click(objectsender,e)

{

();

}

privatevoidbuttonAdd_Click(objectsender,e)

{

if{

else("请输入添加的内容「');

}

privatevoidbuttonDel_Click(objectsender,e)

{

intindex=if(index!

=-1)

{

}

else

("请选择删除项r‘);

}

}

}

总结,我认为使用静态类比较多的地方就是把应用程序的配置文件装载到一个静态类里面,让

所有的窗体和其他实例都可以通过静态属性以及静态方法使用这些数据,比如三层结构或多层结

构都可以访问它,而不是在多个实例间传来传去。

在这里我们讨论的是Windows窗体,其实在两

个不同的实例间交互数据,都可以采用三篇文章中的方案实现,除非是这个类特有的属性或着方

法。

现在都讲完了,虽然不是什么高深的东西,但是希望能对一些初学者有所帮助,同时也欢迎

各位朋友进行技术交流,共同提高。

分析上面几种方法:

1.采用了委托的方法,可以实现。

很好的实现了数据处理与数据显示的分离,即FORM(主)

显示与FORM数据处理,(不需要将FORM2勺显示放在FORM仲)与VC的回调的应用有延续性。

并且确保了FORM仲要修改的属性的私有性。

2.方法2、3都是传递主窗口的引用,比较简单易用。

可以实现

据的传递(不过需要将要FORM传递和要修改的数据设为PUBLIC)

FORM2(主)与FORM所有数

,而这样会存在安全问题。

委托方法可以很好地实现数据的保护

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2