2011-10-17 70 views
1

我想實現在我的應用程序中更改當前用戶。我有以下代碼:在Winforms應用程序中更改當前用戶的實現

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.
我知道那意味着這個錯誤,但我不能重寫我的代碼。 你能幫我嗎?
謝謝。

SOLUTION: 重寫最後一行run方法:

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

感謝喬納森。

+0

你可以啓動另一個程序副本'Process.Start')並殺死當前正在運行的副本?如果你想避免重寫所有代碼來支持多個用戶,那可能是最簡單的方法。 –

+0

在不同的線程中運行第二個實例可能會有所幫助 – Sandy

+0

@Merlyn Morgan-Graham:不,因爲應用程序的啓動時間約爲10-15秒。 – user348173

回答

2

這個問題實際上是很容易的,問題是你(第一負載,第二個按鈕)

快速解決有關此,將有Application.Run調用Application.Run兩次一個ApplicationContext,而不是最初的表單,並從你的公共虛擬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.Run,​​所以委託人有一個包含的實例或上下文(在任何這種意義上,形式,控制檯等)

+0

http://msdn.microsoft.com/en-us/library/ms157901.aspx –

+0

非常感謝。我已經添加了有問題的解決方案。 – user348173

相關問題