C# Tworzenie kilku takich samych okien i kontrola nad nimi

0

W oknie głównym tworzę kilka takich samych okien w ten sposób:

oknoR okno = new oknoR();
okno.Parent = this.Parent;
okno.Show();

To okrojona treść zdarzenia podwójnego kliknięcia na element listy. Chciałbym, żeby okno było tworzone tylko raz dla każdego elementu listy. Tzn. jeśli kliknąłem na gruszki to otwiera się okno. Jeśli kliknę ponownie na gruszki a okno to już jest otwarte to nie otworzy mi się nowe, jeśli nie jest to powinno się otworzyć. Chciałbym móc nadawać nazwy tworzonym okno i to chyba jest właściwość

okno.Name

Czy w formie głównej z której tworzone jest nowe okno jest przechowywana gdzieś informacja o oknach utworzonych, którą można łatwo przeszukiwać a później ewentualnie uzyskiwać dostęp do konkretnego okna?

0

utwórz Dictionary<string, oknoR> w którym będziesz przetrzymywał utworzone okna, a dostęp będziesz miał przez wartość wskazaną w listbox

"globalnie" Dictionary<string, oknoR> dict = new Dictionary<string, oknoR>();
string selectedItem = "gruszki";
oknoR okno = null;
if(!dict.TryGetValue(selectedItem, out okno))
{
  okno = new oknoR();
  okno.Parent = this.Parent;
  okno.Name = selectedItem;
  dict.Add(selectedItem, okno);
}

if (okno!=null)
  okno.Show();
0

Myślałem nad czymś takim ale co z fantem zamknięcia okna? Nie otworzę go już ponownie bo wpis w Dictionary pozostanie.

0

podepnij się pod zdarzenie Closed, tu zaproponowałem dość proste rozwiązanie po Name okna, można

string selectedItem = "gruszki";
oknoR okno = null;
if(!dict.TryGetValue(selectedItem, out okno))
{
  okno = new oknoR();
  okno.Parent = this.Parent;
  okno.Name = selectedItem;
  dict.Add(selectedItem, okno);

  okno.Closed += (s,e)=>{dict.Remove(((oknoR)s).Name);};
}

if (okno!=null)
  okno.Show();

</quote>
0

Wielkie dzięki, działa. Aczkolwiek nie wiem jak;). Mógłbyś mi jeszcze wyjaśnić o co chodzi w tym wierszu? U mnie dokładnie wygląda to tak bo nie miałem takiego zdarzenie jak Closed

 okno.FormClosed += (s, ee) => { dict.Remove(((oknoR)s).Name); };

Rozumiem że dodawane jest zdarzenie i obsługa do niego w jednej linii, później jest rzutownie i polecenie ale w którym momencie wiadomo że s to właśnie ten typ i w dodatku że to akurat chodzi o to utworzone przed chwilą okno. Czy to wynika z tego że to do tego okna przypisuje zdarzenie?

0

s to obiekt sender, czyli kontrolka wywołująca zdarzenie. Formatka też jest kontrolką, a wywołując zdarzenie FormClosed, w sender przekazywana jest referencja do tegoż okienka :) Sender jest typu object, stąd też i to rzutowanie.

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