灵魂腐蚀 发表于 2015-1-16 22:31:11

ASP.NET编程:在.NET中使用托付完成窗体间通讯

我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。  关于窗体间复杂的通讯,接纳VB6.0的办法就可以满意我们的请求,但在一些架构计划庞大的使用中,这类办法就显得有点左支右绌了,同时该办法另有一个弱点,就是它仅仅对经由过程.NET窗体导游增加出来的窗体起感化,而关于自界说的窗体范例我们是没法增加到Forms工具汇合中的。并且也和别的诸如机关函数传参等办法一样,会在窗体间大批相互援用各自的成员,形成了相互之间存在着很年夜的耦合性,十分倒霉于窗体模块间的自力,这不切合优秀软件计划形式的头脑。

  假如我们想在一个窗体中会见另外一个窗体中自界说的成员,必需把该成员的可见性设置为Public大概经由过程属性公然,经由过程属性公然的话还说得已往,但假如把可见性设置成Public的,如许做就无可制止的损坏了范例封装性的准绳,而这一做法也是我们在.NET下开辟相称愿意做的,出格是关于初度打仗.NET的开辟职员,完成会见另外一范例中成员的话开始想到的就是把该成员的可见性设置为Public,固然如许做算不上是毛病,但把这一做法作为本人的主要灵感,最少从面向工具的角度动身明显是分歧适的。

  在.NET下,还为我们供应了别的一种壮大的机制来完成窗体通讯,这就是托付。托付可了解为一品种型平安的函数指针,.NET下的事务的完成都是以托付做为基本的。关于托付在这篇文章中我就不具体先容了,后边会有文章专门先容这一观点。在此我演示经由过程在一个窗体里向别的一个窗体里的ListBox控件增加Item项来讲明这一办法。因而必要两个窗体,一个MainFrm窗体,一个ChildFrm窗体,别的还必要一个Middle类,作为MainFrm和ChildFrm之间通讯的桥梁。我也将给出VB.NET和C#两种言语的代码,以便人人能够做一下对照。

  起首是MainFrm窗体,在MainFrm窗体中,拖一个ListBox控件便可,MainFrm.vb的代码以下(为复杂起见,在此省往主动天生的代码):

PublicClassForm3

PrivateSubForm3_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
 AddHandlerMiddle.SendMessage,AddressOfDoMethod
EndSub

PrivateSubDoMethod(ByValgetstrAsString)
 Me.ListBox1.Items.Add(getstr)
EndSub
EndClass
  再看ChildFrm窗体,在个中拖一个TextBox和一个Button控件,经由过程在TextBox中输出值后,按Button按钮向MainFrm窗体的ListBox控件中增加Item项。

PublicClassForm2

PrivateSubButton1_Click_1(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
 Middle.DoSendMessage(TextBox1.Text)
 TextBox1.Text=""
 TextBox1.Focus()
EndSub
EndClass
  最初看Middle类:

PublicClassMiddle
 PublicSharedEventSendMessage(ByValstrAsString)
 PublicSharedSubDoSendMessage(ByValstrAsString)
 RaiseEventSendMessage(str)
EndSub

EndClass
  为了更好的演示MainFrm和ChildFrm之间的自力性,修正一下Application.Designer.vb的代码:

<Global.System.Diagnostics.DebuggerStepThroughAttribute()>

ProtectedOverridesSubOnCreateMainForm()
 Me.MainForm=Global.WindowsApplication3.MainFrm
 ChildFrm.show()
EndSub
  好了,代码完了,是否是很复杂?经由过程下面的代码能够看出来,经由过程Middle类,MainFrm和ChildFrm都和Middle类通讯,它们之间除参数的耦合外,已不再援用相互的外部成员,如许就显得加倍自力了。

  上面是对应的C#代码,MainFrm.cs:

publicpartialclassMainFrm:Form
{
 privatevoidMainFrm_Load(objectsender,EventArgse)
 {
  Middle.sendEvent+=newMiddle.SendMessage(this.DoMethod);
 }
 publicvoidDoMethod(stringgetstr)
 {
  listBox1.Items.Add(getstr);
 }
}

ChildFrm.cs:

publicpartialclassChildFrm:Form
{
 publicChildFrm()
 {
  InitializeComponent();
 }

 privatevoidbutton1_Click(objectsender,EventArgse)
 {
  Middle.DoSendMessage(this.textBox1.Text);
  textBox1.Text="";
  textBox1.Focus();
 }
}

Middle.cs:

publicstaticclassMiddle
{
 publicdelegatevoidSendMessage(stringstr);
 publicstaticeventSendMessagesendEvent;
 publicstaticvoidDoSendMessage(stringstr)
 {
  sendEvent(str);
 }
}
  一样我们修正一下Program.cs的代码:

staticclassProgram
{
 
 staticvoidMain()
 {
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  //Application.Run(newForm1());
  Form1mainFrm=newForm1();
  childFrmsecondFrm=newchildFrm();
  secondFrm.Show();
  Application.Run(mainFrm);
 }
}
  对照下面的VB.NET和C#代码,我们能够看出VB.NET同意间接用Event关头字声明事务,而C#则必需由我们本人起首声明事务的托付原型,然后再基于该托付声明事务,从这点看来VB.NET显得更简便,实在VB.NET编译器在面前会主动的为我们界说一个托付工具,并且该托付与C#代码声明的托付所天生IL代码是一样的,这点人人能够经由过程Ildasm两头代码检察器来检察一下。激发事务,VB.NET是经由过程RaiseEvent关头字加上事务称号,而C#则是经由过程间接利用事务称号;最初是绑定事务的代码,VB.NET是经由过程AddHandler关头字,C#经由过程重载的+=操纵符,关于以上两点,编译器一样会为我们天生分歧的IL代码。

  固然,下面的例子对照复杂,不外我们完整能够经由过程托付完成庞大的窗体通讯,好比能够传送庞大的数据范例,同时,能够在计划布局加倍优秀的两头通讯类。但也要提示人人,不要动不动就要用托付,它会增添程序的庞大性,应当依据本人的需求思索用何种办法。可怜的程序员,还是逃不出移植的命运!

精灵巫婆 发表于 2015-1-19 16:05:17

是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。

简单生活 发表于 2015-1-19 16:05:17

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

蒙在股里 发表于 2015-1-24 20:48:24

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

分手快乐 发表于 2015-2-2 13:21:28

最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。

海妖 发表于 2015-2-7 21:29:00

现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。

再现理想 发表于 2015-2-23 11:43:37

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

飘灵儿 发表于 2015-3-7 08:45:59

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

金色的骷髅 发表于 2015-3-14 16:24:55

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

仓酷云 发表于 2015-3-21 12:45:59

asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
页: [1]
查看完整版本: ASP.NET编程:在.NET中使用托付完成窗体间通讯