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.