【问题标题】:Winforms - changing form content from one context to anotherWinforms - 将表单内容从一种上下文更改为另一种
【发布时间】:2010-01-06 11:32:54
【问题描述】:

我是一名 ASP.NET 开发人员,被分配了一个小型 Winforms 应用程序任务。我正在执行以下操作:

  • 我有一个带有登录字段和按钮的表单
  • 登录成功后,我想提供应用的主要功能。
  • 目前我正在使用两种表单 - 一种用于登录 (form1),一种用于主功能 (form2) - 当我在它们之间切换时,使 form2 可见,而 form1 不可见。

我确信我应该在一个表单上做所有事情。这样做的正常/最佳方法是什么?

谢谢, 理查德。

【问题讨论】:

  • WF 应用程序不需要登录,Windows 已经这样做了。
  • 因为我没有使用 Windows 身份验证,所以需要登录。

标签: winforms


【解决方案1】:

我认为 Windows 世界中最常见的方法是使用 2 个对话框。例如登录 Skype、Steam、远程桌面、SQL 服务器(使用 SQL Management Studio)等。

Windows 用户也习惯了登录对话框的常见行为(这里我的意思是单击“取消”按钮将关闭应用程序)并且没有其他干扰,如应用程序的主菜单或其他控件。

我建议在主窗体的 FormLoad 事件中显示登录窗体。使用 ShowDialog 方法并检查返回值以确定登录表单是否成功关闭。

为此,您需要

  • 在“确定”按钮的单击处理程序中,将 LoginForm.DialogResult 属性设置为 DialogResult.OK(或使用对象检查器直接在“确定”按钮上设置 DialogResult 属性)

  • 使用对象检查器将取消按钮的 DialogResult 设置为 DialogResult.Cancel

  • 使用对象检查器将 LoginForm 的 AcceptButton 和 CancelButton 属性设置为适当的按钮

MainForm 中的代码:

    private void MainForm_Load(object sender, EventArgs e)
    {           
        LoginForm login = new LoginForm();
        login.ShowDialog(this);

        if (login.DialogResult != DialogResult.OK)
        {
            Close();
        }
        else
        {
           // Init your application ...
        }
    }


LoginForm中的代码:

    private void btnOk_Click(object sender, EventArgs e)
    {           
        if (DoSomeLoginLogic())
            DialogResult = DialogResult.OK; // setting this will close the form
    }

【讨论】:

  • 我推荐单个表单的原因是,如果用户甚至无法登录,您的应用程序就不必加载与主表单关联的所有资源。它还可以更快地打开登录表单.
  • 嗨,布雷特,我不确定我是否理解。作为单一表格,我理解一个带有两个面板的表格。第一个面板是登录输入,第二个是应用程序的其余部分。启动时登录面板可见,第二个不可见。成功登录后可见性将交换。我说的对吗?
【解决方案2】:

恕我直言,我不会在一个表单上这样做,但您可以让您的登录对话框成为您的主应用程序对话框的模态对话框。当用户然后单击登录时,您可以关闭对话框。

用户注销时再次调用。

【讨论】:

    【解决方案3】:

    一个表单是要走的路,一旦成功,程序就可以继续下一个表单。

    使用两个按钮“接受”/“取消”创建一个公开用户名/密码字段的表单。

    创建一个处理登录尝试和成功行为的模型类。

    public class LoginModel {
    
        private LoginForm view;
        public LoginModel() {
            view = new LoginForm(this);
        }
    
        public void Show() {
            view.Show();
        }
    
        public bool LoginAttempt(string user, string pass) {
            // Process login attempt (call LDAP backend etc...).
        }
    
    }
    

    在您的登录表单中,您需要从登录按钮的OnClick 事件中调用LoginAttempt(string, string),如果您愿意,可以将其放入后台线程。一旦登录尝试成功,您就可以调用Close 方法。

    在您的模型中,您还需要一个事件来告诉调用者成功失败。

    如果您查看深夜项目,则可以通过重新打开类似于我在演示 prism 的示例应用程序 (CWPF Samples) 中使用的方法来实现替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多