实现在winforms应用程序中更改当前用户

本文关键字:用户 winforms 应用程序 实现 | 更新日期: 2023-09-27 18:11:20

我想在我的应用程序中实现更改当前用户。我有以下代码:

public class Framework
    {
        private MainForm mainForm = null;
        ... // other fields
        public virtual void run()
        {
            if (appInitializer!=null)
            {
                ISecurityManager securityManager = appInitializer.SecurityManager;
                if (securityManager!=null)
                {
                    if (securityManager.DoLogin())
                    {
                        RegisterDefaultActionsGroup();
                        InitializePlugins(appInitializer.Plugins);
                        // Apply rights for user
                        ActionsManager.Inst.ApplySecurity(securityManager, securityManager.CurrentUser);
                        mainForm = new MainForm();
                        mainForm.Text = appInitializer.ApplicationTitle;
                        if (appInitializer.ApplicationIcon != null)
                        {
                            mainForm.Icon = appInitializer.ApplicationIcon;
                        }
                        CorrectFormSizes(mainForm);
                        Context[Constants.MainForm] = mainForm;                     
                        MenuManager.Inst.FillMenu(DefaultGroups.MAIN_MENU, mainForm.MainMenu, ActionClick);
                        if(appInitializer.IsHaveToCreatePanelInfo) PanelInfoManager.Inst.FillInfo(mainForm);
                        if (appInitializer.IsHaveToCreateToolBar)
                        {
                            MenuManager.Inst.FillToolbar(DefaultGroups.MAIN_TOOLBAR, mainForm.MainToolStrip, ActionClick);                            
                        }
                        mainForm.MainToolStrip.Visible = mainForm.MainToolStrip.Items.Count > 0;
                        NotifyPluginsAboutShowing(appInitializer.Plugins);
                        Application.Run(mainForm);
                    }                   
                }
            }
        }
        ...//other methods
    }   
static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Framework framework = new Framework(new EArchiveInitializer());
            framework.run();                
            }           
        }

在更改用户的按钮中,我有:

 Framework.Instance.MainForm.MainMenuStrip.Items.Clear();   
 Framework.Instance.run();

但是,我得到错误:Starting a second message loop on a single thread is not a valid operation. Use Form.ShowDialog instead.
我知道这意味着这个错误,但我不能重写我的代码。你能帮我吗?
谢谢。

解决方案:重写run方法中的最后一行:

 if (!Application.MessageLoop)
     Application.Run(mainForm);
  else
     mainForm.Show();

谢谢乔纳森。

实现在winforms应用程序中更改当前用户

这个问题实际上很简单,问题是你正在调用Application。运行两次(第一次加载,第二次按钮)

一个快速解决这个问题的方法,是让应用程序。首先运行一个ApplicationContext,而不是一个表单,然后从你的public virtual void Run()方法中加载所需的表单。
public class Framework 
{ 
    private MainForm mainForm = null; 
    ... // other fields 
    public virtual void run() 
    { 
        if (appInitializer!=null) 
        { 
            ISecurityManager securityManager = appInitializer.SecurityManager; 
            if (securityManager!=null) 
            { 
                if (securityManager.DoLogin()) 
                { 
                    RegisterDefaultActionsGroup(); 
                    InitializePlugins(appInitializer.Plugins); 
                    // Apply rights for user 
                    ActionsManager.Inst.ApplySecurity(securityManager, securityManager.CurrentUser); 
                    mainForm = new MainForm(); 
                    mainForm.Text = appInitializer.ApplicationTitle; 
                    if (appInitializer.ApplicationIcon != null) 
                    { 
                        mainForm.Icon = appInitializer.ApplicationIcon; 
                    } 
                    CorrectFormSizes(mainForm); 
                    Context[Constants.MainForm] = mainForm;                      
                    MenuManager.Inst.FillMenu(DefaultGroups.MAIN_MENU, mainForm.MainMenu, ActionClick); 
                    if(appInitializer.IsHaveToCreatePanelInfo) PanelInfoManager.Inst.FillInfo(mainForm); 
                    if (appInitializer.IsHaveToCreateToolBar) 
                    { 
                        MenuManager.Inst.FillToolbar(DefaultGroups.MAIN_TOOLBAR, mainForm.MainToolStrip, ActionClick);                             
                    } 
                    mainForm.MainToolStrip.Visible = mainForm.MainToolStrip.Items.Count > 0; 
                    NotifyPluginsAboutShowing(appInitializer.Plugins); 
                    mainForm.Show(); 
                }                    
            } 
        } 
    } 
    ...//other methods 
}    
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
        Application.EnableVisualStyles(); 
        Application.SetCompatibleTextRenderingDefault(false); 
        Application.Run(new MyHiddenContext());     
        }            
    } 
public class MyHiddenContext 
    :  ApplicationContext 
{
    private static Form activeFormInstance;
    public MyHiddenContext()
    {
        this.RunFramework();
    }
    public void RunFramework()
    {
        Framework framework = new Framework(new EArchiveInitializer()); 
        this.framework.run();
        activeFormInstance = Framework.Instance.MainForm;
    }
    public static void ChangeUser()
    {
        activeFormInstance.Close();
        activeFormInstance.Dispose();
        Framework.Instance.MainForm.MainMenuStrip.Items.Clear();              
        Framework.Instance.run();           
    }
}

不要引用我实际工作的代码,但它更多的是给出一个思路。问题是你不能调用Application。运行多次,所以主要是有一个包含实例或上下文(在任何这样的意义上,形式,控制台等)