2015-01-20 6 views
0

Я создал методы в классе «Cammon». Функцией этого метода является проверка переменной настройки, оттуда она открывает правильную форму в качестве дочернего элемента MID.Как получить родительскую форму приложения?

Вот мой метод

public static void OpenMyForm(string sectionName, string[] keys, Form myform) { 
     //make sure there are no other forms of the ame type open 
     foreach (Form form in Application.OpenForms) { 
      if (form.GetType() == myform.GetType()) { 
       form.Activate(); 
       return; 
      } 
     } 

     if (Settings._AuthenticationMode == "Thumbprint") { 

      var newMDIChild = myform; 

      // Set the Parent Form of the Child window. 
      newMDIChild.MdiParent = Main.ActiveForm; 

      // Display the new form. 
      newMDIChild.Show(); 
     } 


     if (Settings._AuthenticationMode == "Single" && UserInfo.Autherized == true) { 

      var role = new Roles(); 

      if (role.hasAccess(sectionName, keys)) { 
       var newMDIChild = myform; 

       // Set the Parent Form of the Child window. 
       newMDIChild.MdiParent = Main.ActiveForm; 

       // Display the new form. 
       newMDIChild.Show(); 
      } 
      else { 
       Common.Alert("You do not have a permissions to perform this action!"); 
      } 
     } 
    } 

Проблема здесь, когда я называю этот метод, я получаю сильфон ошибки исключения.

Однако, когда я вызываю этот метод, новые формы фактически открываются непосредственно перед тем, как я получу ошибку.

Я считаю, что вопрос находится в строке ниже

newMDIChild.MdiParent = Main.ActiveForm; 

Я считаю, как я устанавливаю родитель неверен. Родитель имя формы в Main()

Вот пример того, как я называю этот метод

Common.OpenMyForm("Vendors", new string[] { "add" }, new DepartmentsAdd()); 

Как я могу исправить эту проблему?

System.NullReferenceException was unhandled 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=Telerik.WinControls.UI 
    StackTrace: 
     at Telerik.WinControls.UI.RadListElement.HandleMouse(Object sender, RoutedEventArgs args) 
     at Telerik.WinControls.UI.RadListElement.OnBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) 
     at Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e) 
     at Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e) 
     at Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
     at Telerik.WinControls.RadControl.WndProc(Message& m) 
     at Telerik.WinControls.UI.RadPopupControlBase.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at RM.Program.Main() 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

ActiveForm является формой, которая в настоящее время имеет фокус, если таковые имеются. Таким образом, может быть другой ребенок MDI, а не основная форма. Обычно я использую класс ApplicationContext для настройки моей основной формы и других связанных деталей контекста. –

+0

@NeillVerreynne Не могли бы вы объяснить, как это делается? Я не уверен, как это сделать. Я новичок в C# подробно ответил в оценках – Jaylen

+0

вы можете google, есть много ссылок, как использовать ApplicationContext. Например: http://etutorials.org/Programming/visual-c-sharp/Part+III+Programming+Windows+Forms/Chapter+11+An+Introduction+to+Windows+Forms/Controlling+a+Windows+Forms + Application/ –

ответ

1

Реализовать Контекстное приложение класса, производный от ApplicationContext:

class MyApplicationContext : ApplicationContext 
{ 
    public static MyApplicationContext CurrentContext; 

    public MyApplicationContext(Form mainForm) : base(mainForm) 
    { 
    //...implement any hooks, additional context etc. 

    CurrentContext = this; 
    } 
} 

Реализации использовать контекст приложения:

[STAThread] 
static void Main(string[] args) 
{ 

    var context = new MyApplicationContext(new MainForm()); 

    // Run the application with the specific context. 
    Application.Run(context); 

} 

Чтобы получить доступ к контекстным данным приложений, как MainForm:

MyApplicationContext.CurrentContext.MainForm 

Таким образом:

// Set the Parent Form of the Child window. 
newMDIChild.MdiParent = MyApplicationContext.CurrentContext.MainForm; 
+0

@NeilVerreynne благодарю вас за ответ. Я обновил свой код, но он все еще не работает. Я все еще получаю сообщение об ошибке при открытии дочернего элемента MID, и он возвращает меня к «var appCtx = new MyApplicationContext (new Main()); Application.Run (appCtx); 'строка внутри файла Program.cs – Jaylen

+0

Вы назначаете .MdiParent, используя статическую переменную вашего контекста приложения? Вы получаете ту же ошибку? Кроме того, stacktrace показывает, что он не работает на элементе управления Telerik. Также может случиться так, что любые события, которые вы подключили, запускают и выполняют ваш код, которые ссылаются на экземпляры, которые еще не созданы. –

+0

это действительно сработало. Проблема с другой строкой кода. огромное спасибо – Jaylen

Смежные вопросы