Form myForm = clsUIMethods.CreateFormInstance(iObjectAppId, sObjName, sFormCaption, sKey, toolCategory, sAccessibleDefaultActionDescription);




    public Form CreateFormInstance(int objectAppID, string formName, string formCaption, string formTag, string accessibleName, string accessibleDefaultActionDescription)
    {
        try
        {

            Assembly myAssembly = null;

            VersionInfo clsAssemblyInfo = GetAssemblyInfo(objectAppID);
            if (clsAssemblyInfo == null)
            {
                throw new Exception("Cannot open " + formCaption + ".\nPlease Check Your Application Menu Rights.", new Exception("Could not Load Assembly for : " + formName + "."));
            }

            formName = clsAssemblyInfo.NameSpace + "." + formName;

            try
            {
                if (objectAppID == 0)
                    myAssembly = Assembly.GetEntryAssembly();
                else if (objectAppID > 5000) //AppID above 5000 are for supporting projects 
                    myAssembly = Assembly.LoadFile(string.Format("{0}\\{1}.dll", Application.StartupPath, clsAssemblyInfo.AssemblyName));
                else
                    myAssembly = Assembly.Load(clsAssemblyInfo.AssemblyName);
            }
            catch
            {
                throw new Exception("Application file not Found.\nPlease Contact " + AppInstance.Name + " Co-ordinator.", new Exception("Could not Load Assembly for : " + clsAssemblyInfo.ApplicationName + "."));
            }

            //if (!clsAssemblyInfo.CheckVersionAtLogin)
            //{
            //    if (GetAssemblyVersion(myAssembly) != clsAssemblyInfo.Version)
            //    {
            //        throw new Exception("Object cannot be opened.\nYou are Running an Application of Different Version.", new Exception("Version mismatch for the Application : " + clsAssemblyInfo.ApplicationName + "."));
            //    }
            //}

            int iOverrideVersionControl = 0;
            try
            {
                if (ConfigurationManager.AppSettings["OverrideVersionControl"] != null)
                    iOverrideVersionControl = ConfigurationManager.AppSettings["OverrideVersionControl"].ToInt32();
            }
            catch { }

            if (iOverrideVersionControl != 1)
            {
                if (clsAssemblyInfo.CurrentAssemblyVersion != clsAssemblyInfo.Version)
                {
                    if (!clsAssemblyInfo.AllowOldVersion)
                    {
                        throw new Exception("Screen cannot be opened.\nYou are Running an Application of Different Version.", new Exception("Version mismatch for the Application : " + clsAssemblyInfo.ApplicationName + "."));
                    }
                    else
                    {
                        if (DisplayMessages("The application version of the screen being opened is different than the release version.\nDo you wish to continue ?", MessageStyle.YesNo, "Version mismatch for the Application : " + clsAssemblyInfo.ApplicationName + ".") == MessageResult.No)
                            throw new Exception("OLDVERSION");
                    }
                }
            }

            //if (objectAppID == 0)
            //    myAssembly = Assembly.GetEntryAssembly();
            //else
            //{
            //    try
            //    {
            //        myAssembly = Assembly.Load(clsAssemblyInfo.AssemblyName);
            //    }
            //    catch
            //    {
            //        throw new Exception("File not Found.\nPlease Contact " + AppInstance.Name + " Co-ordinator.", new Exception("Could not Load Assembly for : " + clsAssemblyInfo.ApplicationName + "."));
            //    }

            //    if (!clsAssemblyInfo.CheckVersionAtLogin)
            //    {
            //        if (GetAssemblyVersion(myAssembly) != clsAssemblyInfo.Version)
            //        {
            //            throw new Exception("Object cannot be opened.\nYou are Running an Application of Different Version.", new Exception("Version mismatch for the Application : " + clsAssemblyInfo.ApplicationName + "."));
            //        }
            //    }

            //    //string str = myAssembly.ImageRuntimeVersion; 
            //    //FileInfo fileInfo = new FileInfo(Directory.GetCurrentDirectory() + @"\" + assemblyName);
            //    //if (fileInfo.Exists)
            //    //myAssembly = Assembly.LoadFile(fileInfo.FullName);
            //    //else
            //    //    throw new Exception("File Not Found.\nPlease Contact " + AppInstance.Name + " Co-ordinator.", new Exception("Could not Load Assembly : " + assemblyName + "."));
            //}

            //myAssembly.GetName().CultureInfo = glMod.GetCultureInfo();

            Form myForm = myAssembly.CreateInstance(formName, true) as Form;
            if (myForm != null)
            {
                MainForm.Instance.AskBeforeClosingForm = true;
                if (formCaption != string.Empty)
                    myForm.Text = formCaption;
                myForm.Tag = formTag;
                myForm.AccessibleName = accessibleName;
                myForm.AccessibleDefaultActionDescription = accessibleDefaultActionDescription;
                myForm.KeyPreview = true;
                return myForm;
            }
            else
            {
                return null;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Скажите, пожалуйста, как поймать исключение, которое происходит при нажатии кнопки в форме который создается с использованием метода CreateFormInstance().

Мой код нажатия кнопки :

  private void button1_Click(object sender, EventArgs e)
        {
            throw new NullReferenceException("nullref test muh sa");
        }

Мне нужно исключение в родительской форме, которая создала эту форму.

0
Muhammad VP 26 Мар 2014 в 19:00
1
Что ж, большая часть проблемы, вероятно, связана с catch (Exception ex) { throw ex; } ... Но: что именно происходит сейчас и как это соотносится с тем, что вы ожидаете ? Примечание: если вы не хотите, чтобы нажатие кнопки приводило к взрыву приложения, ваше нажатие кнопки должно перехватить исключение.
 – 
Marc Gravell
26 Мар 2014 в 19:02
Возможно, вам нужно реализовать какое-то уведомление в дочерней форме. Один из подходов - иметь событие в дочерней форме, которое запускается при возникновении исключения. Затем родительская форма может подписаться на нее после создания экземпляра.
 – 
Victor Hurdugaci
26 Мар 2014 в 21:41

1 ответ

Лучший ответ

Вы можете добавить обработчик событий в Application.ThreadException, это позволит вам запускать код и заставит ваше приложение не выходить всякий раз, когда в вашем (основном) потоке пользовательского интерфейса возникает неперехваченное исключение. В качестве альтернативы вы также можете обрабатывать 'AppDomain.CurrentDomain.UnhandledException', это позволит вам запускать код всякий раз, когда в любом потоке вашего приложения возникает исключение, но не препятствует выходу вашего приложения

0
BenCamps 26 Мар 2014 в 23:34