C# + MEF + MDI + problem z ponownym otwarciem okna (dziecka)

0

Witam, po uruchomieniu programu ładuję dostępne wtyczki :

 private void Form1_Load(object sender, EventArgs e)
        {
            this.obsluga = new sterowanie();
            this.obsluga.Compose(Form1.ActiveForm);
        }

klasa która to załatwia :

public class sterowanie
    {
        [ImportManyAttribute(AllowRecomposition = true)]
        public IList<Lazy<IWindows, IWindowsMetaData>> wtyczki = new List<Lazy<IWindows, IWindowsMetaData>>();

        public void Compose(Form forma)
        {
            AggregateCatalog cat = new AggregateCatalog();
            cat.Catalogs.Add(new DirectoryCatalog(@"bin\plugins"));
            CompositionContainer contnr = new CompositionContainer(cat);
            contnr.ComposeParts(this);
        }
    }

Następnie, chcę otworzyć okno MDI, które jest w DLL'ce i przy okazji przekazać parametr

czyli np w OnClik jakiegoś buttona :

SqlConnection MSSQLConnection = new SqlConnection(@"Data source=adres_serwera; Initial catalog=bazwatest;Integrated Security=SSPI; Trusted_Connection=Yes;");
            for (int i = 0; i < obsluga.wtyczki.Count(); i++)
            {
                if (obsluga.wtyczki[i].Metadata.Nazwa.ToString() == "WtyczkaTest")
                {
                    obsluga.wtyczki[i].Value.OpenWindow(Form1.ActiveForm, MSSQLConnection);
                }
            }

implementacji metody OpenWindow :

public bool OpenWindow(Form pParenForm, SqlConnection MSSQLConnection)
        {
            MSSQLConnection.Open();


            SqlDataAdapter mssqlAdapter = new SqlDataAdapter("select * from tabtest", MSSQLConnection);
            DataSet dt = new DataSet("Pracownicy");
            mssqlAdapter.Fill(dt, "Pracownicy");
            dataGrid.DataSource = dt.Tables["Pracownicy"];
            MSSQLConnection.Close();

            this.MdiParent = pParenForm;
            this.Show();
     
            return true;
        }

I wszystko ładnie działa, otwiera się okno w kontenerze (kontenerem jest forma główna programu), pokazują się rekordy - ot, wszystko działa. Następnie zamykam to okno i chcę je otworzyć ponownie. I dostaję błąd

Cannot access a disposed object.

Rozumiem, że wywoływana jest metoda Dispose() dla formy znajdującej się w DLL'ce, czyli zwalniane są zasoby. Jednak co powinienem zrobić, żeby móc ponownie otworzyć tą formę ? Próbowałem zamiast zamykać, chować formę. W sumie to ta opcja działa, jednak co będzie jeżeli użytkownik otworzy w trakcie pracy wiele form (różnych) i będą one tylko schowane - przecież program zeżre sporo pamięci. Jednym słowem nie wiem jak utworzyć nową instancję mojego okna znajdującego się w DLL'ce, uwzględniając oczywiście parametr SqlConnection.

0

spróbuj sobie stworzyć taką funkcję do wyświetlania okienek MDI:

        private void showMDIWindow(Form x)
        {
            x.MdiParent = this;
            x.Show();
        }

potem tworzysz nowy Form gdzie chcesz i podajesz jego nazwe jako argument tej funkcji np:

            Form noweOkienko = new Form();
            showMDIWindow(noweOkienko);

1 użytkowników online, w tym zalogowanych: 0, gości: 1