灵魂-放水

为学日益,为道日损。

BlogJava 首页 新随笔 联系 聚合 管理
  296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks

提问:


问者:7712190(25458848@163.com) 信誉:96 级别:user5 日期:2006-9-10 23:49:27

小弟一直都是做 B/S开发 
这几天心血来潮 想写一写 C/S程序 
一入门就遇到这个问题 我在 登陆窗体体 NEW了 一个新窗体吧新窗体Show了 之后 原来得窗体cLOSE。新NEW得窗体也关闭了  不知道为什么 请指点

另求 C/S程序得 设计方法。
比如如何处理 公共得变量 等应该注意得事情  希望大家不吝赐教

回复:



答者:wzq6511() 信誉:100 级别:user1 日期:2006-9-11 0:36:28 id:36659940

不要用close,用hide,原先的窗体只能隐藏起来不能关闭。

答者:bejon(阿牛[如果我懂,必坦诚相告;如果您懂,请不怜赐教。]) 信誉:93 级别:star1 日期:2006-9-11 2:00:21 id:36660132

在new form后使用this.close;来完成

在new form之前把窗体id写在注册表,然后在new form之后检查那里,如果有值就使用api关闭那个窗体,然后把注册表清空。



答者:zhgroup(王员外) 信誉:99 级别:star1 日期:2006-9-11 8:06:33 id:36660371

1、要看原窗体是那个窗体了,如果是入口的窗体,则应hide,想要显示时可用Show.
如果是登陆窗体,在主窗体的Main入口处
FormLogin frm = new FormLogin();
frm.ShowDialog();
if 登陆失败
 关闭窗体
 return
2、和B/S基本类似,只不过对于状态信息比较容易控制。



答者:qzh1119(大浪淘沙) 信誉:59 级别:user2 日期:2006-9-11 8:12:07 id:36660412

up

答者:qzh1119(大浪淘沙) 信誉:59 级别:user2 日期:2006-9-11 8:12:33 id:36660419

关注,学习中

答者:bestshl(快乐的Coder) 信誉:100 级别:user2 日期:2006-9-11 8:24:52 id:36660529

zhgroup(王员外) 正解

答者:interboy(冯东) 信誉:100 级别:user2 日期:2006-9-11 8:27:37 id:36660559

zhgroup(王员外) 说的对,如果你把main函数放在loginform里的话,那么它就是主窗体,如果你在它里面调用了this.close();你想啊,主窗体都关了,别的呢,皮之不存,毛将焉附!
建议把loginform作为子窗体,通过主窗体了掉子窗体进行判断

答者:7712190(25458848@163.com) 信誉:96 级别:user5 日期:2006-9-11 12:40:41 id:36667940

问题是我不想HIde  真的没有其他的办法了么?

答者:lovefootball(蟑螂(生活就是扯淡--做人要放低姿态)) 信誉:98 级别:star2 日期:2006-9-11 12:49:07 id:36668125

上面已经说清楚了
如果你不想hide
那你就在main里面先new这个登陆窗体
如果登陆成功在run主窗体
否则关闭

答者:zahuifan(杂烩饭) 信誉:93 级别:star1 日期:2006-9-11 12:56:33 id:36668305

up

答者:guyes123(以为喜欢这里,所以来接分) 信誉:100 级别:user1 日期:2006-9-11 13:00:06 id:36668391

一般还是用HIDE吧
其他的我就不会了

答者:naturalth(自我批判,是思想、品德、素质、技能创新的优良工具) 信誉:99 级别:user4 日期:2006-9-11 13:07:31 id:36668586

#region "Main"
public ModMain()
{
}

[STAThreadAttribute]
static void Main() 
{
//异常处理
Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);

            Common.Database.ConnectionString = Get_Info();
frmLogon frm = new frmLogon();
            frm.txtUser.Text = loginUser;
if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
{
return;
}
            
System.Windows.Forms.Application.Run(new myMenu());
}
#endregion

答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:10:44 id:36672298

VS默认的WinForm程序模板只有一个程序消息循环,并且入口Form关闭的同时退出程序消息循环,结束程序。

开始
 |
 |
消息循环(入口Form)
 |
 |
结束




答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:14:42 id:36672390

可以设计下面的流程

开始
 |
 |                    False
消息循环(登陆Form)---------
 |                          |
 | True                     |
 |                          |
消息循环(主Form)           |
 |                          |
 |--------------------------
退出

答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:16:34 id:36672453

Demo

StartApp.cs文件
/////////////////////////////////////////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Text;

namespace WinFromDemo
{
public class StartApp
{
private static bool LoginResult = false;

[STAThread]
static void Main()
{
//First Message Loop
LoginContext loginContext = new StartApp.LoginContext();
Application.Run(loginContext);

if (LoginResult)
{
//Second Message Loop
StartApp.MainContext mainContext = new StartApp.MainContext();
Application.Run(mainContext);
}
}

public class LoginContext : ApplicationContext 
{
private LoginDialog loginDialog;

public LoginContext() 
{
loginDialog = new LoginDialog();
loginDialog.StartPosition = FormStartPosition.CenterScreen;
loginDialog.Closed += new EventHandler(OnFormClosed);            
loginDialog.Show();
}

private void OnFormClosed(object sender, EventArgs e) 
{
LoginResult = !(this.loginDialog.DialogResult == DialogResult.Cancel);

ExitThread();
}
}

public class MainContext : ApplicationContext 
{
private Form mainForm;

public MainContext() 
{
mainForm = new Form();
mainForm.StartPosition =  FormStartPosition.CenterScreen;
mainForm.Closed += new EventHandler(OnFormClosed);            
mainForm.Show();
}

private void OnFormClosed(object sender, EventArgs e) 
{
ExitThread();
}
}
}
}


答者:csLius() 信誉:100 级别:user2 日期:2006-9-11 15:17:56 id:36672496

http://blog.csdn.net/Knight94/archive/2006/08/22/1104957.aspx


答者:pegtop(再回首) 信誉:100 级别:user2 日期:2006-9-11 15:23:51 id:36672677

新窗体是在原窗体基础上建立起来的,不能关闭原窗体只能隐藏.

要想处理全局变量,建议采用Static变量

答者:pretty_soft() 信誉:100 级别:user1 日期:2006-9-11 15:36:50 id:36673096

我觉得还是
 开启---登陆画面/显示主窗体默认界面---用showdialog显示登陆---判断返回值初始权限
这样比较好
把应用程序加载放到启动画面去
这种更适合比较大的系统,不同的模块不同的用户权限

答者:Santos(快乐的GG) 信誉:100 级别:user4 日期:2006-9-11 16:15:46 id:36674473

ShowDialog();方法才是正解.

Button1_Click()
{

xxxForm frm = new xxxForm();
frm.ShowDialog();

}

答者:kissknife(侧身向南边) 信誉:100 级别:user5 日期:2006-9-11 16:20:54 id:36674652

http://www.cnblogs.com/KissKnife/archive/2006/09/10/500158.html

答者:ttgzs(一路狂奔) 信誉:100 级别:user1 日期:2006-9-11 17:01:58 id:36676000

#region "Main"
public ModMain()
{
}

[STAThreadAttribute]
static void Main() 
{
//异常处理
Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);

            Common.Database.ConnectionString = Get_Info();
frmLogon frm = new frmLogon();
            frm.txtUser.Text = loginUser;
if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
{
return;
}
            
System.Windows.Forms.Application.Run(new myMenu());
}
#endregion


答者:kubbye(小蛤蟆就是我) 信誉:100 级别:user1 日期:2006-9-11 23:15:00 id:36681363

准确的说,做为启动窗体的那个窗体是不能关的,它关了,程序就停了,其他的窗体可以关,启动窗体只能隐藏

答者:kubbye(小蛤蟆就是我) 信誉:100 级别:user1 日期:2006-9-11 23:17:29 id:36681383

接上面,你可以把主界面作为启动窗体,然后在主界面未显示出来前,先显示登录窗体,登录成功再显示主窗体,登录不成功,直接退出,直接在form的load事件中写就好了

答者:qiujb(楚留香) 信誉:100 级别:user2 日期:2006-9-12 8:12:25 id:36682515

zhgroup(王员外) 正解

答者:Samen168(让代码为你写代码) 信誉:95 级别:star1 日期:2006-9-12 8:56:52 id:36683381

逻辑问题
main()
{
   loginform lf = new loginform();
   if(lf.Showdialog() == DialogResult.OK)
   {
     mainform mf = new mainform();
     mf.show();
   }
}
这样根据不存在谁打开谁

答者:Samen168(让代码为你写代码) 信誉:95 级别:star1 日期:2006-9-12 8:57:00 id:36683386

根本

答者:sunxianyu(找工作) 信誉:100 级别:user2 日期:2006-9-12 9:05:26 id:36683679

zhgroup(王员外) ( ) 信誉:99    Blog 
正解

答者:fds2003(Hunter) 信誉:99 级别:user5 日期:2006-9-12 9:17:54 id:36684103

上面能说的都讲了!

答者:yangao(偶新手 请问门在哪里?) 信誉:100 级别:user4 日期:2006-9-12 9:41:16 id:36684775

学习

答者:henrydee1(小d) 信誉:101 级别:user2 日期:2006-9-12 10:29:21 id:36686255

if (this.ActiveMdiChild!=null)
{
this.ActiveMdiChild.Close(); //关闭已经打开的子窗体
}

InSchool child_InSchool=new InSchool();
child_InSchool.MdiParent=this;//this表示本窗体为其父窗体
child_InSchool.Show();

答者:xiaoliangwh(小亮wh) 信誉:100 级别:user2 日期:2006-9-12 23:55:03 id:36705585

xuexi

答者:sdl2005lyx() 信誉:100 级别:user4 日期:2006-9-13 8:26:41 id:36706505

lz:一个很简单的办法(刚好前几天解决的):
     你在原来的窗体设置一个public bool bNew=false;的变量,在你要new新窗体的地方改成如下代码:
     bNew=true;
     this.Close();
     //原来窗体消失了,但它的类作用域并没有消失
   
然后在你原来定义、使用原窗体变量的地方,即frmOld.ShowDialog();之后:
    if(frmOld.bNew)
    {
        NewForm frmNew=new NewForm ();
        frmNew.ShowDialog();
    } 
问题就搞定了。。。  



答者:GXY2005(晓晨美眉好^_^) 信誉:94 级别:user5 日期:2006-9-13 8:52:21 id:36707030

jf

答者:wuhuiITren(CSDN男主角) 信誉:100 级别:user2 日期:2006-9-14 13:26:23 id:36740819

楼上的都说了,楼主自己一个个试就可以了啊,想怎么办就怎么办啊

答者:slex(蘂橤(蛋不能扯远,笑不能搞大)) 信誉:100 级别:user4 日期:2006-9-14 14:35:50 id:36743030

上面的那两个方法已经能解决lz问题了,该结了 呵呵
posted on 2007-02-02 08:53 放水老倌 阅读(11318) 评论(2)  编辑  收藏 所属分类: .NET

Feedback

# re: [转]新手入门-WinForm如何打开一个新窗体得同步关闭当前窗体。另求C/S结构程序设计方式。 2007-08-21 17:51 Jos
原窗体如果是主窗体的话,那么原窗体是不可以Close,只能hide.主窗体Close了就会把整个程序关闭.  回复  更多评论
  

# re: [转]新手入门-WinForm如何打开一个新窗体得同步关闭当前窗体。另求C/S结构程序设计方式。[未登录] 2007-08-29 08:07 放水老倌
在手持设备端开发的时候,hide不太好用。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: