动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.初学Java注意什么?.
.310-025 scjp exam dumps 06/10/.
.Java中的枚举器(反复器).
.DiskSuite做raid0的note.
.用J2SE 1.4 进行 Internet 安全编.
.使用simpson规则 完成积分运算.
.java 应用程序 标题栏图标 的 自.
.Java图形调试器 JSwat 3.2 发布(.
.使用Hibernate进行对象的关系映射.
.Java 泛型的理解与等价实现.
.利用osworkflow实现业务流程.
.java设计模式之Memento(恢复对象.
.Java套接字编程(下).
.初学Java要注意什么.
.古代帝国中的图片资源节省算法.
.通过动态编译获取字符串表达的值.
.Java应用利器组合:Ant+JUnit+Co.
.学习Jakarta Struts 1.1 (三).
.win2000server install j2ee.
.穿透Socks5 代理的UDP编程穿透So.

.Net中掌握Windows窗体间数据交互(1)

发表日期:2008-1-5 |



  Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集,它使您得以开发丰富的 Windows 应用程序。一个Windows窗体就代表了.NET架构里的System.Windows.Forms.Form类的一个实例。
  
  作者在CSDN技术论坛.NET板块下的C#分类经常看到有人问起如何在两个Form间传递数据,访问修改对方窗体里面的值。对于有经验的程序员来说不是什么高深的东西,而对于初学者来说这些基础的东西往往是一个问题,并且存在这种现象,往往比较复杂的东西他们会,要用什么了就去学什么,实际上并没有真正的去理解把握它,基础不扎实,所以就有了想通过自己对窗体编程积累的经验来写一些这方面的文章,以供学.NET的朋友参考,也借此机会同各位朋友进行交流,写得不合理的地方请各位朋友提宝贵意见,下面我分了三个部分来讲。
  
  一.使用带参数的构造函数
  我们要做的预备工作就是新建两个窗体,下面是两个窗体的布局,很简单:
  
 .Net中把握Windows窗体间数据交互(1)(图一)

  说明: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也是。
  
  到这里为止功能是实现了,但是总觉得不是很合理,让两个窗体控件传来传去,现在我举一个恰当一点的例子。
  
  修改了两个窗体:
  
.Net中把握Windows窗体间数据交互(1)(图二)

  说明:在这个例子中我们的两个窗体都加了一个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();
  }
  
  编译运行程序,在子窗体中对数据进行修改,关闭后,主窗体就会显示更新后的数据。
  
  这里有一点要提醒一下,比较两个例子,我们都传的是引用类型,一个是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();
上一篇:剖析.Net下的数据访问层技术(1) 人气:346
下一篇:.Net中掌握Windows窗体间数据交互(2) 人气:291
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-4 LPLY CMS 网站管理系统 v5.0
2008-9-4 缤纷互动视频交友 v3.01.902
2008-9-4 ADN视频收藏专家 v3.0 bulid 080
2008-9-4 天空网络电影系统SKYUC v2.5.6 简
2008-9-4 Web Wiz Rich Text Editor(文本编
2008-9-4 幻影动漫网视频系统(Ppdong) v1.
2008-9-4 乐维电脑在线DIY配置系统
2008-9-4 老樊文章管理系统SQL版
2008-9-4 ASP.NET 2.53 缩略图水印组件源码
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵