IM軟件中怎么处理Login、Loading、Main窗体之间的加载

wesnow 2007-12-24 12:52:35
刚学WINFORM,最近在做一个IM软件练手,但是在登录时就出现了问题。以前写登录时,都是只有一个LoginForm和一个MainForm,我在Application.run(MainForm())以前就new LoginForm().showDialog(),然后判断返回值,或者在MainForm()的Load事件里加载LoginForm都能很好地解决。
现在的问题是我想在LoginForm里不连接数据库,只进行最基本的检查,把连接数据库的工作放到LoadingForm或MainForm中,我现在的做法是在Application.run(MainForm())之前new LoginForm().showDialog(),然后再在MainForm的Load事件里用showDialog()把LoadingForm显示出来,等连接数据库,判断登录和下载好友列表等完成以后再关闭LoadingForm,这样就可以使MainForm显示出来,现在的关键问题是我关闭LoadingForm的代码总是运行不到,LoadingForm一直显示。另外,也试过多线程自己没搞定。
[code=c#]
//啟動類
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LoginForm loginForm = new LoginForm();
if (loginForm.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}

}
//MainForm的load事件中部分代碼,可以在这里连接数据库,也可以在LoadingForm里连接
private void MainForm_Load(object sender, EventArgs e)
{
loadingForm = new LoadingForm();
loadingForm.ShowDialog();
LoginInfoValue loginInfo = LoginInfo._loginInfo;
try
{
conn.Open();
string strSql = "select count(*) from LoginInfo where LEmail = '" + LoginInfo._loginInfo.lemail + "' and LPassWord = '" + LoginInfo._loginInfo.lpassword + "'";
SqlCommand com = new SqlCommand(strSql, conn);
int count = int.Parse(com.ExecuteScalar().ToString());
MessageBox.Show(count.ToString());//这句可以执行到
//loadingForm.CloseLoadingForm +=new LoadingForm.CloseForm(loadingForm_CloseLoadingForm);
loadingForm.Close();//测试用,这句执行不到,LoadingForm一直显示,有什么好的方法可以解决?
if (count > 0)
{
loadingForm.Close();
}
else
{
loadingForm.Close();
MessageBox.Show("用户名或密码错误!");
Application.Exit();
}
}
catch (Exception sqle)
{
MessageBox.Show(sqle.Message);
}
//後面代碼省略
}
[/code=c#]
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesnow 2007-12-26
  • 打赏
  • 举报
回复
总算解决了
wesnow 2007-12-25
  • 打赏
  • 举报
回复
娘的,没权限修改自己的贴子,操!!!!!!!
版主看到了麻烦把帖子中[/code=c#]改为[/code]
wzd24 2007-12-25
  • 打赏
  • 举报
回复
Form.ShowDialog()后面的代码在窗体关闭之前是不会被执行的。你把Form.Close()放在后面,当然无法关闭窗体。因为那段代码无法被执行到。
你应该在LoadForm显示之前先创建一个线程来处理业务逻辑,然后再显示LoadForm。这样业务代码才不会被阻塞。当然,委托是一定要用的。

还有一个方法就是:不用ShowDialog()来显示窗体,而是用Show()来显示。
wesnow 2007-12-24
  • 打赏
  • 举报
回复
最好能给个多线程实现的例子,不知道用事件能实现不,我不喜欢写委托的。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧