Dostęp do kontrolek w różnych formach

1

W głównej formie programu klikam w przycisk "Dodaj":

user image

Pojawia mi się wtedy nowa forma, w której wybieram plik i pozostałe opcje:

user image

Chciałbym, żeby po kliknięciu "Wyślij" dane z tej drugiej formy pojawiły się w XPTable z głównej formy. Problem w tym, że potrzebuje z jednej formy dobrać się do kontrolek drugiej, co wydaje mi się złym pomysłem. Jak można to inaczej zrobić?

0

Użyć wzorca, np. Model View Presenter

4

z jednej formy dobrać się do kontrolek drugiej, co wydaje mi się złym pomysłem.

Słusznie się wydaje.

Jak można to inaczej zrobić?

Druga forma może zwracać kolekcję elementów.
Albo - jeżeli dodawanie ma się odbywać pojedynczo - przez eventa.

1

Wyeksponuj interesujące Cię elementy jako publiczne właściwości. Np. jeśli chcesz zwrócić użytkowników z listy to stwórz właściwość List<T> która będzie to robić. To samo tyczy się wybranych opcji, np. Rozpocznij od razu/Dodaj do kolejki mogą być wystawione jako właściwości bool lub stworzonego przez Ciebie typu wyliczeniowego (enum) który będzie odzwierciedlał dostępne opcje.

0

Dzięki za odpowiedzi. Nie wiem, czy dobrze zrozumiałem - najpierw tworzę kolekcję:

Collection<string> collectionToReturn = new Collection<string>();

następnie w odpowiednich miejscach dodaję interesujące mnie stringi, np.:

collectionToReturn.Add(fileToUpload.FileName);

i tworzę publiczną właściwość, która zwraca kolekcję elementów:

public Collection<string> CollFun
{
	get
	{
		return collectionToReturn;
	}
	set
	{
		collectionToReturn = value;
	}
}

To wszystko dzieje się w drugiej formie, w której mam przycisk "Wyślij". Jak po kliknięciu w niego odebrać te dane w formie głównej?

0

Jak po kliknięciu w niego odebrać te dane w formie głównej?

A jak tworzysz drugą formę?

public Collection<string> CollFun
{
	get
	{
		return collectionToReturn;
	}
	set
	{
		collectionToReturn = value;
	}
}

To jakiś... dżawizm.

public Collection<string> CollFun { get; private set; }

I już. Nie trzeba osobnego pola.

1

Ok, pod eventem przypisanym do przycisku "Wyślij" daj coś w tym stylu:

             
this.SelectedLogins = GetSelectedLogins();
this.DialoResult = DialogResult.OK; 
this.Close();

Gdzie GetSelectedLogins() to metoda zwracająca listę wybranych loginów. Przypisujesz to do Twojej właściwości (autowłaściwości jak zaproponował Azarien).

Natomiast w formie wywołującej będziesz miał coś takiego:

 
            LoginSelection form = new LoginSelection();
            form.ShowDialog();

            if (form.DialogResult != DialogResult.OK)
                return;

            List<string> logins = form.SelectedLogins;

Wywołując ShowDialog() zamiast Show() spowodujesz że egzekucja kodu w formie wywołującej zostanie wstrzymana aż do zamknięcia formy wyboru loginów. Jeszcze dwie kwestie:

  1. Używaj List<string> zamiast Collection<string> chyba że tworzysz własną kolekcją dziedziczącą po Collection<T>.
  2. Używaj odpowiednich nazw- CollFun nie mówi nic. SelectedLogins lub coś w tym stylu będzie ok.
0

Zrobiłem tak, jak w tym przykładzie: http://stackoverflow.com/questions/5233502/how-to-return-a-value-from-a-form-in-c i skorzystałem z twojego kodu:

LoginSelection form = new LoginSelection();
form.ShowDialog();

        if (form.DialogResult != DialogResult.OK)
            return;

        List<string> logins = form.SelectedLogins;

i to działa tak, jak chciałem. Dzięki za pomoc!

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