C#两窗口相互转换为主窗口。。高手来。

C#两窗口相互转换为主窗口。。高手来。,第1张

换一种转换方式

窗体1中:

private void button1_Click(object sender, EventArgs e)

{

Form2 f2 = new Form2();

f2f1 = this;

thisHide();

f2Show();

}

窗体2中:

public Form1 f1;//全局变量

private void button1_Click(object sender, EventArgs e)

{

thisHide();

f1Show();

f1BringToFront();

}

这样就能在窗体1中点按钮后,窗体1隐藏,窗体2出现,在窗体2中点按钮后,窗体2隐藏,原来的窗体1出现

回答补充:

更正一下你的一个观点“冒失下次再SHOW的时候,,是一个新窗口”

请仔细看我的写法,在窗体2中点按钮返回窗体1时,显示的原来的窗体1,不是new出来的新窗口。是否show出来一个新窗口完全取决于你的代码

另外 功能多了 自然会占用更多资源,当然我们都在寻求更少资源实现更强功能,希望你能找到更好的方法

关于这个问题,thisParentForm是当前控件或当前窗体的母控件(或窗体),你的头一句是要把thisParentForm强制转换为SystemWindowsFormsDataVisualizationChartingUtilitiesSampleMainMainForm类型,但是如果母控件并不是这个类型或这个类型的派生类,那么强制类型转换就会抛异常。建议你这样写代码:SystemWindowsFormsDataVisualizationChartingUtilitiesSampleMainMainFormmainForm=thisParentFormasSystemWindowsFormsDataVisualizationChartingUtilitiesSampleMainMainForm;

if(mainForm==null)

{

stringtemStr=thisParentFormGetType()ToString();

SystemWindowsFormsMessageBoxShow(temStr);

}

//如果没有猜错的话,你应该是随便建立了一个windows程序,然后复制粘贴了MSDN上的代码,他这段代码的母窗体应该不是一个普通的windows窗体。再详细的你要自己去研究一下了。

用全局变量来保存子线程里需要更新的值 ,创建一个互斥对象,让子线程占用互斥对象,在start函数后面waitforsingleobject,等待线程结束时释放互斥对象,这样,当waitforsingleobject获得互斥对象时,就可以更新主线程窗口了。这其实就是简单的线程同步问题。

比如你主窗体是Form1 form1,子窗体是Fom2 form2;

在子窗体类中加入公共变量 public Form1 mainForm = null;

在主窗体生成子窗体时加入form2mainForm = this;

在子窗体中使用mainFormsomePublicFunction(args);就可以了。

如果主窗体是以模态开的子窗体,使用子窗体的ParentForm属性也可访问到主窗体。

如果你一个都不会的话你还是自己再慢慢研究。你所说的要求是编程的最低要求!一定要自己动手!给你一点思路:登录窗口:当点击登录时候判断textboxtext==“”;则提示不填写用户名(或密码)。注册窗口:有必要填写textboxtext不为空且用户名不重复,则点击“注册”即可注册成功并数据库插入该记录。其他的还是自己琢磨的好,VS对基本的这些功能实现是非常容易的!===================================================================下面给你一个完整的登录界面代码在VS2005NET平台下用C#和Access实现用户登录界面的窗体应用程序一直就想加个technology的类别,但却迟迟未能动笔.一来不得不承认直到现在,我在技术上还依然只是一个没怎么入门的菜鸟,二来技术本身也不是我的兴趣所在.但不管怎样,既然我现在还要攻读计算机专业的硕士学位,那么技术,总还是要学的.需要说明的是,对于那些高手来说,这里的东西想必都是小菜一碟,不值一提.我写在这里,只是给自己的总结吧.另外我所写的东西,很多也是参考网络和书籍的,其实真正属于我自己的东西也不多.由于四处查找,具体的出处很多也已记不清了,而且在开源环境下也很难说某些代码就是谁的原创,所以这里虽然没有说明,但很多东西也都是参考他人的,在此先要对那些给了我帮助的书籍作者,网上的发贴人和回贴人表示感谢.去年研一刚开学时,自己的实践能力还几乎为零.因为我心里清楚,自己本科的确是混过来的,计算机科学与技术的学士学位,我其实是不配去拿的.九月十号进实验室后,开始学习项目组里需要用到的C#,但单纯学习语言也没什么明确的目的性.实验室里和我同一导师本校保研的同学和我说起,他们大四下学期刚进实验室时,师兄就让他们先试着写一个类似QQ登录那样的一个用户登录程序.我自己没有任何经验,想也就像他们一样,从这里起步吧,于是在看C#的同时我就考虑怎么样去实现这样一个程序了.我知道对于过来人来说,这样的一个程序实在是再简单不过了,但对于当时刚开始的我,着实费尽了不少周折.虽然后来基本实现了这样一个程序,但在数据库上还是有些问题.因此虽然当时也曾想过贴个technology类别的日志,但终究还是一直拖了下来.前段时间通过同学的介绍,帮沈阳日报的一个朋友做了一个会员管理的软件.软件本身也极其简单,基本没有太多的技术含量,但在开发的过程中自己通过各种渠道去查找资料,也在各方面都学到了很多.所以这段经历对我还是很有意义的.而且自己在计算机专业学了四年有半后终于可以自己做出来一些可以应用到实际中的东西,也终于凭借自己的专业能力获得了一点回报,无论回报是多是少.嗯,是要鼓励一下自己的.也激励自己再接再厉!此后我可能会把在这一软件中所学到的东西陆续总结一下到这里.而这一软件开发的第一个模块也就是用户登录模块.也就是我最初在尝试做的东西.好,说了这么多无关的话,现在言归正传,来看登录模块的具体实现.由于用户登录模块的实现关键的一点就是要将用户的信息存储在数据库中,并在用户登录时到数据库中对信息进行查找和核对,所以首先要先建立一个数据库.实际上对于初学者来说,数据库的相关 *** 作也正是实现本登录模块的难点所在.这也是当时我刚开始写这段程序时困扰我并困扰了我很久的地方.在数据量不是很大的情况下,可以就用微软Office组件里的Access数据库,比较方便.这里在D盘用Access建立一个数据库命名为dbmdb,并在数据库中建一个表,命名为users,在表中建两个字段,命名为userName和userPassword,分别存储用户名和密码.然后在表中插入几条数据,用于登录界面的测试.下面是登录模块的开发.在VisualStudio2005的C#开发环境下,新建一个Windows应用程序的项目,将第一个窗体命名为Login,即作为用户登录窗体.在窗体上添加相应控件,设计效果如下:其中两个文本框分别命名为userNameTbx,pswTbx,用于接收用户输入的用户名和密码,两个按钮命名为loginBtn,cancleBtn,用于用户提交登录信息或取消以关闭登录框.将文本框pswTbx的PasswordChar属性设置为或其它字符,这样用户在该文本框中键入字符时,界面显示的一律为然后在项目中添加一个Windows窗体,命名为MainForm,对于实际使用的软件来说,当用户登录成功后都应该d出这样的软件主窗体.这里只是实现登录功能,暂不对主窗体添加任何内容.下面就是登录界面的后台实现,主要就是用户点击login按钮后后台事件响应代码的编写.登录窗体后台代码如下:usingSystem;usingSystemCollectionsGeneric;usingSystemComponentModel;usingSystemData;usingSystemDrawing;usingSystemText;usingSystemWindowsForms;usingSystemDataOleDb;//添加Access数据库相关 *** 作所需的引用namespaceLoginTest{publicpartialclassLogin:Form{publicLogin(){InitializeComponent();}privatevoidloginBtn_Click(objectsender,EventArgse){//用户点击loginBtn后事件响应的代码//用来连接Access数据库的字符串,@的作用是避免"\"等字符被当成转义符stringconStr=@"Provider=MicrosoftJetOLEDB40;DataSource=D:\dbmdb";OleDbConnectioncon=newOleDbConnection(conStr);conOpen();stringcmdStr="selectfromuserswhereuserName='"+thisuserNameTbxText+"'anduserPassword='"+thispswTbxText+"'";OleDbCommandcmd=newOleDbCommand(cmdStr,con);OleDbDataReaderreader=cmdExecuteReader();if(readerRead())//如果找到用户信息,说明登录成功{MainFormnewForm=newMainForm();newFormShow();//d出主窗体thisHide();//隐藏用户登录窗体}else{MessageBoxShow("用户名或密码错误!");}readerClose();cmdConnectionClose();conClose();}privatevoidcancleBtn_Click(objectsender,EventArgse){thisClose();}}}以上代码调试通过后,即可成功运行.当输入数据库中正确的用户名和密码后点击login,则登录窗体关闭,主窗口d出.大功告成!大功真的告成了吗?且慢.当在调试状态下启动软件,登录成功d出主窗体后再关闭主窗体,从用户角度来说软件应该关闭了.但程序却还处在调试状态而没有结束运行.即使不在调试状态下,关闭主窗体后似乎软件已经关闭了,但实际上打开Windows任务管理器,发现登录窗体的线程还一直处在运行状态.这显然是不完善的.检查后发现在上面的代码中,d出主窗体后只是将登录窗体隐藏了,thisHide();而并没有真正关闭.好,那在d出主窗体后就把登录窗体关闭吧.我们将thisHide();改成thisClose();很简单吧.但很遗憾,事情并没有这么简单.这样改过之后我们再运行软件,发现登录成功之后登录窗体的确是实实在在的关闭了,但主窗体在闪了一下,甚至你可能连闪那一下都没看到,就也随之关闭了.这显然不是我们想要的结果.那如何能让登录窗体真正关闭,而又不影响主窗体的正常运行呢?这个问题也困扰了我了阵,当然还是很容易在网上找到了答案.实际上建立项目时登录窗体是第一个窗体,也就是默认的启动窗体,或者说是主进程,如果只将窗体隐藏,显然进程一直运行.而或将窗体关闭,也就是将主进程关闭,那整个软件自然也就关闭了,因此d出的MainForm自然也会随之关闭.当然关于进程的问题我还有待进一步学习.要解决这个问题,就要找到应用程序的入口,看看整个程序的执行过程.打开项目中的programcs文件,发现代码如下:usingSystem;usingSystemCollectionsGeneric;usingSystemWindowsForms;namespaceLoginTest{staticclassProgram{//////应用程序的主入口点。///[STAThread]staticvoidMain(){ApplicationEnableVisualStyles();ApplicationSetCompatibleTextRenderingDefault(false);ApplicationRun(newLogin());}}}要想解决上面的问题,就不能让程序直接执行ApplicationRun(newLogin());,而可做如下修改.staticvoidMain(){ApplicationEnableVisualStyles();ApplicationSetCompatibleTextRenderingDefault(false);//ApplicationRun(newLogin());Loginlogin=newLogin();if(loginShowDialog()==DialogResultOK){loginClose();ApplicationRun(newMainForm());}}首先实例化一个登录窗体,当登录成功时返回DialogResultOK的结果,然后关闭登录窗体,将主窗体作为主线程启动.相应的,在登录界面的代码文件中做如下修改:if(readerRead()){//MainFormnewForm=newMainForm();//newFormShow();//thisHide();thisDialogResult=DialogResultOK;}至此,我们完成了一个最基本的用户登录模块的实现.最后,关于Access数据库有几点说明.第一,数据库文件的位置.其实数据库文件没必要放到或复制到项目文件中,而在进行数据库连接相关 *** 作时直接使用其绝对路径即可.实际上在实际使用软件时,一般数据库文件也不会和软件的安装文件放在同一目录下的.最开始尝试写登录模块时,我就通过添加数据源什么的把数据库文件复试到了项目的Debug文件夹下,结果程序编译时会产生很多数据覆盖的问题,会有很多不必要的麻烦.另外一点就是Access数据库虽然用得着比较方便,但凡事有其两面性,Access数据库也有一些不利之处,影响比较明显的一点就是其可恶的关键字.这点也曾给我带来不少麻烦.由于很多关键字都是Access数据库保留的,因此在建表命名时如果一不小心和其重复了则对数据库 *** 作时就会失败,而这一问题又很难发现,结果就是程序干调调不通却找不到原因所在.因此在使用Access数据库时命名一定要小心.附上转自网上的”真烂Access关键字”,如果 *** 作Access数据库失败了可以先看一下是不是命名与下面这些关键字重复

你把那三个进程关闭,只留这个 Form_Main ,然后同时按 Ctrl 、Shift、ESC 打开任务管理器,看看“应用程序”中有没有这个 Form_Main ,如果没有,切换到进程,看看有没有这个进程。

以上就是关于C#两窗口相互转换为主窗口。。高手来。全部的内容,包括:C#两窗口相互转换为主窗口。。高手来。、System.Windows.Forms.DataVisualization.Charting.Utilities.SampleMain.MainForm有错误!、VS2010开发C++窗口程序,点击按钮后启动子线程,子线程处理数据后,如何将数据显示到窗口控件上等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9693001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存