在.net中轻松掌握Windows窗体间的数据交互
- 格式:doc
- 大小:171.00 KB
- 文档页数:44
net做的windows服务程序,怎么与用户界面交互net做的windows服务程序,如何与用户界面交互?我用.net做了个windows服务程序,网上查到了些东西,可以弹出个winform用户界面来了,现在我想在服务中放个timer,定时的写些内容,并显示在winform用户界面中的textbox1里,该怎么做?我的大致代码如下(不成功):public partial class Service_CARMS : ServiceBase{Form_Main f; //与用户交互的Form窗口System.Threading.Thread threadform = null;protected override void OnStart(string[] args){threadform = new Thread(new ThreadStart(FormShow));threadform.Start();}public void FormShow(){GetDesktopWindow();IntPtr hwinstaSave = GetProcessWindowStation();IntPtr dwThreadId = GetCurrentThreadId();IntPtr hdeskSave = GetThreadDesktop(dwThreadId);IntPtr hwinstaUser = OpenWindowStation("WinSta0", false, 33554432);if (hwinstaUser == IntPtr.Zero){RpcRevertToSelf();return;}SetProcessWindowStation(hwinstaUser);IntPtr hdeskUser = OpenDesktop("Default", 0, false, 33554432);RpcRevertToSelf();if (hdeskUser == IntPtr.Zero){SetProcessWindowStation(hwinstaSave);CloseWindowStation(hwinstaUser);return;}SetThreadDesktop(hdeskUser);IntPtr dwGuiThreadId = dwThreadId;f = new Form_Main(); //此FORM1可以带notifyIcon,可以显示在托盘里,用户可点击托盘图标进行设置System.Windows.Forms.Application.Run(f);dwGuiThreadId = IntPtr.Zero;SetThreadDesktop(hdeskSave);SetProcessWindowStation(hwinstaSave);CloseDesktop(hdeskUser);CloseWindowStation(hwinstaUser);}[DllImport("user32.dll")]static extern int GetDesktopWindow();[DllImport("user32.dll")]static extern IntPtr GetProcessWindowStation();[DllImport("kernel32.dll")]static extern IntPtr GetCurrentThreadId();[DllImport("user32.dll")]static extern IntPtr GetThreadDesktop(IntPtr dwThread);[DllImport("user32.dll")]static extern IntPtr OpenWindowStation(string a, bool b, int c);[DllImport("user32.dll")]static extern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,bool fInherit, uint dwDesiredAccess);[DllImport("user32.dll")]static extern IntPtr CloseDesktop(IntPtr p);[DllImport("rpcrt4.dll", SetLastError = true)]static extern IntPtr RpcImpersonateClient(int i);[DllImport("rpcrt4.dll", SetLastError = true)]static extern IntPtr RpcRevertToSelf();[DllImport("user32.dll")]static extern IntPtr SetThreadDesktop(IntPtr a);[DllImport("user32.dll")]static extern IntPtr SetProcessWindowStation(IntPtr a);[DllImport("user32.dll")]static extern IntPtr CloseWindowStation(IntPtr a);private void timer1_Tick(object sender, EventArgs e){//MessageBox.Show("mm");////////经调试发下以下代码异常,提示/////"调用的目标发生了异常,..........{"未将对象引用设置到对象的实例f.ShowInf("触发器触发"); //调用与用户交互的Form里的方法,该方法附加字符串到textbox1中。
ASP页面之间的数据传递与保持页面之间数据的传递与保持是实现网站与用户交互的重要手段之一,也是Web应程序的基本功能,它的实现效率对程序性能有直接的影响。
ASP 提供了多种方法来实现数据的传递与保持,这些方法各有所长。
以下对常用的几种方法做阐述。
一、数据在页面间的传递在用户访问网站的过程中,页面之间的跳转总是非常频繁。
用户通常点击页面上某个超链接而进入网站其它页面,也有可能点击某个按钮提交信息从而打开了目标页面,甚至是网页程序在某个条件达成时自动的页面重定向。
无论哪种情况使得用户浏览时换了页面,都不能丢了用户的状态,也就是在用户本次访问网站过程中,其状态应该是连续的,有些数据必须在页面之间传递下去,以供目标页面获取。
目标页面可以通过Request对象来获取源页面传来的数据。
1.Request.QueryStringQueryString是最简单最常用的传值方法,它能够获取HTTP查询字符串附在URL后面的参数值:URL?参数名1=参数值&参数名2=参数值......而以URL方式进行页面转换有以下几种:超链接:<a>标记的href属性或控件HyperLink的NavigateURL 设置URL后面可以连接参数;控件Button的postbackURL属性可以设置目标页面URL,后面可以连接参数;表单数据以get方法发送给指定的目标URL,会将控件值作为参数连接在URL后面,参数名就是控件名或控件ID,参数值就是控件的值;Response对象的Redirect方法可以设置参数URL,使客户端浏览器立即重定向到指定的URL;Session对象的Transfer方法可以设置参数URL将客户端重定向到新的页面,它终止当前页的执行,保留当前页面的表单(Form)数据和查询字符串(QueryString),并为当前请求开始执行URL指定的目标页面,而源页面已加载的数据依然保存。
简单数据绑定简单数据绑定是单个控件属性和一个求值的可计算表达式之间的一对一关联。
您实际上可以使用任何求值的表达式,但在多数情况下,您将绑定到某种数据源。
在Windows 窗体应用程序模型中,控件通过公开属性和数据绑定表达式之间的绑定集合来实现简单数据绑定。
在Web 窗体模型中,简单数据绑定使用您作为字符串分配给控件属性的数据绑定表达式。
数据绑定表达式是包装在代码块(例如,<%# … %>)中的任何有效的 代码。
正如您看到的那样,这种表达式非常类似于从前的可靠ASP 代码块<%…%>。
不过,#符号表现了二者之间的根本区别。
# 符号告诉ASPX 运行时分析器表达式可能包含每次加载页面时都需要求值的内容。
也就是说,<%# … %> 块的工作方式就像<% … %> 块在ASP 中一样。
相反,在 中,旧样式的<%…%>代码块被编译为页对象,并且只有在这时才处理。
因此,下面两个表达式产生不同的输出:<asp:Label runat="server" id="MyLabel"text='<% "Selected: " + DDList.SelectedItem.Text %>' /> <asp:Label runat="server" id="MyLabel"text='<%# "Selected: " + DDList.SelectedItem.Text %>' />在前一种情况下,编译的页将使用下面的伪代码设置标签的文本:Label MyLabel = new Label();MyLabel.Text = "Selected: " + "Value of the item";表达式DDList.SelectedItem 进行求值计算,它的值分配给标签。
.NET中winform与webform互相通讯实例,CS调用BS页面的JS函数时间:2010-05-1521:38来源:作者:点击:71次大家都知道.NET可以开发winform与webform页面,有时候在开发项目过程中要结合BS+CS这样来应用,那么本站做一个实例来测试winform与webform互相通讯的实例,下面先看下效果:winform 调用bs页面的js函数效果图webform页面发送信息到winform效果图好了,看完大家都知道.NET可以开发winform与webform页面,有时候在开发项目过程中要结合BS+CS这样winformwebform第一、名为:/******/ponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingnamespaceTestJSWin{publicpartialclassMainForm:Form{publicMainForm(){}///<summary>///BS调用方法///</summary>///<paramname="strShow"></param>publicvoidJavascriptCall(stringstrShow){MessageBox.Show(strShow);}}}好,做完winform,下面是页面的做法。
第2、HTML <html></script></head><body><inputtype="button"value="CallWinformMethed"onclick="fn_call()"/></body></html>嗯!到现在为此,所有操作都可以了,非常简单,如果你有兴趣来按上面的代码来测试下在.net中利用webbrowser控件实现WinForm与WebForm交互在.net中的WebBrowser控件可以让你装载WindowsForm应用程序中的Web网页和其它采用浏览器的文件。
visual studio 中两个窗体(winform)之间相互传值的方法如何在Visual Studio中实现两个窗体(WinForm)之间的数值传递?1. 引言在Visual Studio中,WinForm是一种常用的图形用户界面设计工具,它可以帮助我们创建窗体应用程序。
有时候,我们需要在两个或多个窗体之间传递数据,以实现不同窗体之间的交互。
本文将介绍几种在Visual Studio中实现两个窗体之间数据传递的方法。
2. 通过构造函数传递数据通过构造函数传递数据是最简单和常见的方法之一。
我们可以在第二个窗体的构造函数中添加参数,用于接收从第一个窗体传递过来的数据。
下面是一个示例:```c#// 第一个窗体public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string data = "Hello";Form2 form2 = new Form2(data);form2.Show();}}// 第二个窗体public partial class Form2 : Form{public Form2(string data){InitializeComponent();label1.Text = data;}}```在上面的示例中,通过在第二个窗体的构造函数中添加一个string类型的参数data,我们可以将第一个窗体中的数据传递给第二个窗体,并在第二个窗体中使用。
3. 使用属性传递数据另一种常见的方法是使用属性来传递数据。
我们可以在第一个窗体中定义一个公共属性,然后在第二个窗体中访问该属性并获取数据。
下面是一个示例:```c#// 第一个窗体public partial class Form1 : Form{public static string Data { get; set; }private void button1_Click(object sender, EventArgs e){Data = "Hello";Form2 form2 = new Form2();form2.Show();}}// 第二个窗体public partial class Form2 : Form{public Form2(){InitializeComponent();label1.Text = Form1.Data;}}```在上面的示例中,我们使用静态属性Data来传递数据。
在.net中轻松掌控windows窗体间的数据交互(一)zhzuo(秋枫)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数据给子窗体。
.NET中窗体间相互访问的几种方式在我们的程序中,窗体之间经常要相互访问彼此的成员,调用彼此的方法,或者激发彼此的事件。
下面就我的经验,简单谈谈在.NET中窗体间相互访问的几种方式。
以下给出了C#.NET和的示例代码。
用Form1、Form2类分别表示主、从窗体。
1、内部成员访问法,适合于主窗体访问它所创建的从窗体对象中的成员。
只需将从窗体允许主窗体访问的那些成员加上internal或Friend限定符。
例如:2、将以上方法反过来用,让从窗体访问创建它的主窗体中的成员,需要增加一个步骤:在从窗体的构造函数中传入一个主窗体的引用,以便找到创建它的主窗体(新建的构造函数中不要忘了调用InitializeComponent()函数)。
主窗体创建从窗体对象时传入自身的引用。
例如:注:我的朋友wuzhenzhi指出,对主窗体的引用,通过属性或方法传入要比通过在构造函数中传入好,因为“对于一个窗体,没什么,但如果是一个用户控件,我们经常会像拖动Button控件一样从工具栏里拽下来,这时系统就会调用默认的那个构造函数,而不是你的那个重载版本,这办法就失灵了。
”这个建议有道理。
3、从窗体访问主窗体中的成员,如果主窗体只有一个实例,或者被访问对象是全局性的,可以将主窗体中要求访问的成员设置为静态的,加上static或Shared限定符即可:4、还可以运用.NET的事件委托机制,实现更加灵活的相互调用。
下例是从窗体激发主窗体的事件。
事件委托机制的功能事实上远比此例强大,大家可以找书看看它的详细用法。
5、同样的道理,参考方法2和方法4可以实现主窗体激发从窗体的事件,这个请读者自己实验。
当然这样一来代码会显得比较乱。
一个较好的解决方法是将事件封装入一个接口,同时在事件的发布方和订阅方实现。
这种技术在.NET Remoting远程对象操作技术中尤为重要,有一篇不错的文章给大家参考:《Remoting事件处理全接触》(/wayfarer/articles/75213.html)6、习惯了VB6中全局变量的朋友可能觉得.NET中不支持全局变量对于窗体间的交互很不方便,那么再请大家参考这篇文章:《.NET窗体之间的交互》(/warsgrobe/archive/2005/07/29/438013.aspx),里面叙述了用模拟全局变量的方法。
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,buttonC ancel。
当我们新建一个窗体的时候,设计器会生成默认的构造函数: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作为参数传到子窗体构造函数,以非模式方式打开,这样打开的fo rmChild的文本框就显示了”主窗体”文本,是不是很简单,接下来我们传一个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的Co ntrols容器。
修改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和check BoxFrm12完成了对主窗体中的textBoxFrm1和checkBoxFrm2的修改,因为textBoxFrm1和textBoxFrm12是同一个引用,而checkBoxFrm2和checkBoxFrm12也是。
到这里为止功能是实现了,但是总觉得不是很合理,让两个窗体控件传来传去,现在我举一个恰当一点的例子。
修改了两个窗体:<第二个例子>说明:在这个例子中我们的两个窗体都加了一个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("");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());}elseMessageBox.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);}elseMessageBox.Show("请选择删除项或者没有可删除的项!");}退出Form2子窗体:private void buttonOK_Click(object sender, System.EventArgs e){this.Close();}编译运行程序,在子窗体中对数据进行修改,关闭后,主窗体就会显示更新后的数据。
这里有一点要提醒一下,比较两个例子,我们都传的是引用类型,一个是String,另一个是ArrayLi st,为什么string类型不能修改主窗体的数据呢?其实在.Net中对string类型的修改并不是修改原来的值,原来的值没有变化,而是重新生成一个新的字符串,下面是一个很好的说明。