• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekazanie listy do innego formularza

Mały hosting, OGROMNE możliwości
0 głosów
556 wizyt
pytanie zadane 1 stycznia 2023 w C# przez Mariusz1990 Nowicjusz (120 p.)
Cześć. Proste(chyba) pytanie ale jakoś nie potrafię tego ogarnąć. W internecie znalazłem parę przykładów ale tak jakby dookoła to robią. Mam dwa formularze. Na jednym wyświetlam listę np. List<string> ludzie. A na drugim mam kontrolkę TextBox z której tekst ma być dodawany do listy ludzie. Jak to zrobić? Dałby ktoś prosty, łopatologiczny przykład?

1 odpowiedź

+1 głos
odpowiedź 1 stycznia 2023 przez Velta Maniak (52,910 p.)

Utwórz właściwość w formularzu odpowiadającym za wprowadzanie nowego elementu listy:

public partial class SecondForm : Form
{
    public string? Output = null;

    [...]
}

A następnie obsłuż go w formularzu, z którego wywołujesz formularz umożliwiający wypełnienie kontrolki wejścia:

private void SomeControl_SomeEvent(object sender, EventArgs e)
{
    using (SecondForm inputForm = new())
    {
        inputForm.ShowDialog();

        string personOutput = inputForm.Output;

        [...]
    }
}

Żeby mieć całkowitą pewność, że formularz został poprawnie zamknięty, możesz przy zatwierdzeniu formularza dla danych wejściowych ustawić wyliczenie DialogResult:

private void SomeControl_SomeEvent(object sender, EventArgs e)
{
    [...]

    Output = SomeTextBox.Text;

    DialogResult = DialogResult.OK;

    Close();
}
private void SomeControl_SomeEvent(object sender, EventArgs e)
{
    using (SecondForm inputForm = new())
    {
        if (inputForm.ShowDialog() == DialogResult.OK)
        {
            string personOutput = inputForm.Output;

            [...]
        }
    }
}

 

komentarz 1 stycznia 2023 przez Mariusz1990 Nowicjusz (120 p.)

Dałbyś radę mi to wypisać na moim przykładzie?

Bo za nic w świecie nie mogę tego skumać..

Tu mam kod form1

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        List<string> list = new List<string>();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Show();
        }
    }
}

a tu kod form 2

namespace WindowsFormsApp4
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            list.Add("imie");
        }
    }
}

No ale to wiadomo że nie działa. Bo nie znajduje listy list. Dasz radę mi to na chłopski rozum tu wytłumaczyć?

komentarz 1 stycznia 2023 przez Mariusz1990 Nowicjusz (120 p.)
No chyba że tą listę powinienem inicjować w innym miejscu aby była widoczna w kilku formach? Wydawało mi się że jest to proste zagadnienie a utknąłem w martwym polu..
komentarz 1 stycznia 2023 przez Velta Maniak (52,910 p.)
edycja 1 stycznia 2023 przez Velta

Listę list możesz zmodyfikować bezpośrednio przy użyciu referencji (o czym później), ale najlepiej byłoby wykorzystać drugi formularz Form2 do zwrócenia wartości, którą użytkownik wpisał:

public partial class Form2 : Form
{
    public string? Output = null;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string inputValue = SomeTextBox.Value; // Twoja kontrolka TextBox

        if (string.IsNullOrEmpty(inputValue) || string.IsNullOrWhiteSpace(inputValue)) // warto sprawdzać jakkolwiek poprawność podanych danych
        {
            MessageBox.Show("Wprowadzono pustą wartość.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return; // pozwala zatrzymać wykonanie voida w tym momencie w zależności od potrzeby
        }

        Output = inputValue;

        Close();
    }
}

W głównym formularzu Form1 odniesiesz się do tego formularza niemal jak do każdego innego obiektu i jego właściwości, która została ustawiona przy wciśnięciu przycisku (zapewne zatwierdzenia):

public partial class Form1 : Form
{
    List<string> list = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form = new();
        form.ShowDialog(); // używaj ShowDialog() zamiast Show(), wtedy główny formularz zostanie zablokowany

        if (form.Output != null) // domyślnie jest null, w przypadku gdy na przykład użytkownik się rozmyślił
        {
            list.Add(form.Output);
        }
    }
}

Wracając do dodania elementu przy wykorzystaniu referencji: jako inny sposób możesz dodać nowy element wpisany przez użytkownika bezpośrednio do listy, przekazując referencję w konstruktorze formularza Form2 (jak w każdej innej klasie):

public partial class Form2 : Form
{
    List<string> ListReference = null;

    public Form2(List<string> peopleList)
    {
        InitializeComponent();

        ListReference = peopleList;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string inputValue = SomeTextBox.Value; // Twoja kontrolka TextBox

        if (string.IsNullOrEmpty(inputValue) || string.IsNullOrWhiteSpace(inputValue))
        {
            MessageBox.Show("Wprowadzono pustą wartość.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return;
        }

        ListReference.Add(inputValue);

        Close();
    }
}

Wtedy musisz jako parametr obiektu formularza Form2 podać listę formularza głównego Form1 (jej referencję):

public partial class Form1 : Form
{
    List<string> list = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form = new(list);
        form.ShowDialog(); // w tym przypadku wywołanie wystarczy
    }
}

Wybierz podejście w zależności od potrzeby.

komentarz 1 stycznia 2023 przez Mariusz1990 Nowicjusz (120 p.)
Dzięki. Przeanalizowałem pierwszy sposób i działa. I jeśli dobrze rozumiem to w ten sposób da się pojedynczo dodawać elementy do listy? Jeśli ktoś chciałby dodać kilka elementów listy należy skorzystać z drugiej metody?
komentarz 1 stycznia 2023 przez Velta Maniak (52,910 p.)

Możesz dodawać zawartość kolekcji do listy przez jej metodę AddRange. Możesz na przykład zamienić kontrolkę TextBox na RichTextBox, by umożliwić wpisanie wielu linii i według właściwości Lines określić kolejne elementy:

ListReference.AddRange(RichTextBox.Lines);

Oczywiście możesz też skorzystać z pierwszego wspomnianego sposobu i stworzyć właściwość z tablicą ciągu znaków (bo takową kolekcję RichTextBox.Lines zwraca):

public string[] Output = new string[] {}; // inicjalizacja pustej tablicy

Albo dla lepszej czytelności kodu:

public string[] Output = Array.Empty<string>();

Wtedy pewnie walidacja polegałaby na sprawdzeniu, czy użytkownik wprowadził jakąkolwiek linię w kontrolce:

if (form.Output.Length > 0)
{
    list.AddRange(form.Output);

    // ewentualne dalsze czynności
}

 

komentarz 2 stycznia 2023 przez Mariusz1990 Nowicjusz (120 p.)
Ok.Dzięki za super wyjaśnienie. Teraz stało się to dla mnie w końcu zrozumiałe.

Podobne pytania

0 głosów
1 odpowiedź 374 wizyt
pytanie zadane 2 grudnia 2017 w C i C++ przez ayo1001 Obywatel (1,890 p.)
0 głosów
0 odpowiedzi 756 wizyt
pytanie zadane 17 kwietnia 2019 w C# przez Shimeo7 Obywatel (1,910 p.)

93,717 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,261 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...