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

c# Jak wpisać dane do TextBox na Form1 z innej klasy nie tworząc nowego wystąpienia Formy?

Object Storage Arubacloud
+1 głos
232 wizyt
pytanie zadane 21 marca 2023 w C# przez Porters Nowicjusz (150 p.)
Witam,

Proszę o pomoc.

Mam stworzoną ręcznie Form2 na której umieszczony jest textBox1. Z innej klasy programu chcę wpisywać dane do tego textBoxa.

Robiąc nowe wystąpienie formy przez new za każdym razem tworzę nową forme.

{
            Form2 NowaForma2 = new Form2();
            NowaForma2.textBox1.Text = "coś tam";
            NowaForma2.Show();
}

W jaki sposób wykonać wpis do textBoxa1 na Form1 aby ta wartość była aktualizowana a nie wyświetlana ciągle nowe Form?

Dziekuje.

1 odpowiedź

+1 głos
odpowiedź 21 marca 2023 przez PH03NIX Mądrala (6,130 p.)

Spróbuj tworzyć Form2, tylko raz i przechowywać do niej referencję. Potem tylko się odwołujesz do raz stworzonego obiektu, np.

public class XYZ
{
  private Form2 form2;
  public XYZ()
  {
    form2 = new Form2();
    form2.Show();
  }

  public void AktualizujTextBox(string message)
  {
    form2.textBox1.Text = message;
  }
}

 

komentarz 21 marca 2023 przez Porters Nowicjusz (150 p.)
Super! właśnie o to mi chodziło DZIĘKUJE! Nie zamykam tematu, jeszcze mam kilka innych pyta ;-) Jeżeli możesz... W jaki sposób uzyskać dane z funkcji statycznej? np.

 

public static void AktualizujTextBox(string message) { form2.textBox1.Text = message; } ?
komentarz 21 marca 2023 przez PH03NIX Mądrala (6,130 p.)
Z tej funkcji nie możesz nic uzyskać - słowo kluczowe void oznacza, że nie zwracasz żadnej informacji. Jeżeli chcesz coś zwrócić z funkcji musisz zastąpić void, wybranym typem, a następnie zwrócić zmienną tego typu (przy pomocy return).

Jeżeli chodzi o odwołanie to zamiast tworzenia obiektu klasy, a potem obiekt.funkcja(), podajesz nazwa_klasy.funkcja(), w tym przypadku XYZ.AktualizujTextBox("xyz")
komentarz 21 marca 2023 przez Porters Nowicjusz (150 p.)
edycja 21 marca 2023 przez Porters
Sztos!

Powrócę jeszcze do pierwszego wątku.

Mając teraz sytuację odwrotną. Na Form2 utworzona z przybornika umieszczam button a w nim

private Form1 form1; - to jest poza buttonem na górze pod klasą

private void button1_Click(object sender, EventArgs e)
        {
            AktualizujTextBoxform1("tekst z Form2 do Form1");
        }

oraz

public void AktualizujTextBoxform1(string message)
        {
            form1.textBox1.Text = message;
        }

to w Formie 2 ma użyć:private Form1 form1;?

Po uruchomieniu button program wywala: System.NullReferenceException: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”

Dodając do

public Form2()
        {
            InitializeComponent();
            form1 = new Form1();//tworzenie nowej formy
        }

 

Po kompilacji program nie pokazuje Form1 oraz Form2
komentarz 21 marca 2023 przez PH03NIX Mądrala (6,130 p.)
public Form2()
        {
            InitializeComponent();
            form1 = new Form1();//tworzenie nowej formy
        }

Tworzysz form1, ale nie "pokazujesz" - metoda Show(). Nulla wyrzucało, bo najwyraźniej nie zainicjowałeś form1. Co do tego, że program nie pokazuje żadnego okna, to już zależy od tego jak wygląda twój program.cs, zazwyczaj tam jest inicjalizowane pierwsze okno, np.

static class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }
}

 

komentarz 22 marca 2023 przez Porters Nowicjusz (150 p.)
edycja 22 marca 2023 przez Porters

@PH03NIX, Mam problem raczej inny.

1. Jeżeli wprowadzę:  form1 = new Form1(); - do poniższej klasy

  public CSRAsync() /to jest klasa która wykonuje określony program
        {

         form1 = new Form1();
        }

Program nie wyświetla form raczej z powodu, że cały program się wiesza.

2. Jeżeli wprowadzę tworzenie nowego obiektu w pętli programu:

form1 = new Form1();

this.form1.textBox1.Text = "coś tam";

to program nie pokazuje formy ponieważ nie mam form1.show();

3. Jeżeli wprowadzę form1.show() to program pokazuje część formy i także się wiesza.

form1 = new Form1();

this.form1.textBox1.Text = "coś tam";

 form1.show();

 

EDIT. Teraz mam pętlę przy inicjacji z dwóch klas. Klasa Form1 i CSRAsync zapętlają się wzajemnie ponieważ tworzę dwukierunkową wymianę danych. Jak temu zapobiec?

Mam:

public Form1(){
            InitializeComponent();
            csrasync = new CSRAsync();
             }

oraz 

 public CSRAsync()
        {
            InitializeComponent();
            form1 = new Form1();
        }

 

Ujmując temat inaczej:

Tworząc dwie formy z przybornika Form1 i Form2. Każda forma ma button oraz textBox. Jak przekazywać wartość "coś tam 1" z Form1 do textBox form2 oraz "coś tam 2" z Form2 do textBox Form 1? 

1
komentarz 22 marca 2023 przez Porters Nowicjusz (150 p.)

EDIT z rozwiązaniem dla szukających na przyszłość:

w Form1:

public void SetTextBox1(string tekst)
        {
             textBox1.Invoke(new Action(delegate ()
            {
                textBox1.AppendText(Convert.ToString(tekst));
            }));
        }

Więcej: https://learn.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8&redirectedfrom=MSDN

Dziękuje bardzo PH03NIX za pomoc oraz za zaangażowanie!!!

Podobne pytania

+1 głos
1 odpowiedź 445 wizyt
0 głosów
0 odpowiedzi 196 wizyt
+1 głos
1 odpowiedź 625 wizyt

92,536 zapytań

141,377 odpowiedzi

319,455 komentarzy

61,922 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...