przekazywanie danych miedzy formami - błąd

0

Wiem, że tan tamat był już poruszany.
Mam taki kod:

public Form1 form1= new Form1();
form1.form1szerokosc.Enabled = true;
form1.form1wysokosc.Enabled = true;
form1.form1jakosc.Enabled = true;
form1.toolStripButton1.Enabled = true;

Ten kod wywoływany jest na formie 2.
I nic sie nie dzieje na formie 1.
Ale jak dodam:
form1.Show();
to się wyświetla ale są dwie formy nr1.
Co zrobić żeby na formie 1 pokazały się wyniki kodu bez jej ponownego uruchamiania?

0
Merowing napisał(a)

Wiem, że tan tamat był już poruszany.

To pisz w temacie gdzie ten problem byl poruszany. Po co znowu zakladac temat o tym samym?

I co do samego tematu to dawalem link do swietnego arta na CodeProject, gdzie jest wszystko pieknie wytlumaczone. Poszukaj.

0

Wiem, że dawałeś link ale tam jest wytłumaczone jak wysłać dane do tworzonej formy a nie już istniejącej.

0

Daj kod i napisz dokladnie co chcesz uzyskac.

0

Kod form nr2:

private void button1_Click(object sender, EventArgs e)
        {
            int i=0;           
            String[] wlasnosci = new string[4];
            string load = listBox1.SelectedItem.ToString();
            StreamReader stream = new StreamReader(Application.StartupPath + "\\profile\\" + load);
            while (!stream.EndOfStream)
            {
                wlasnosci[i]=stream.ReadLine();
                i++;
            }
            
            form1.form1szerokosc.Enabled = true;
            form1.form1wysokosc.Enabled = true;
            form1.form1jakosc.Enabled = true;
            form1.toolStripButton1.Enabled = true;
            form1.form1szerokosc.Text = wlasnosci[0];
            form1.form1wysokosc.Text = wlasnosci[1];
            form1.form1jakosc.Text = wlasnosci[2];
          
            
            Close();
        }

Forma wczytuje liste plików do listboxa i po wcisnięciu przycisku pobiera dane z pliku i przekazuje do formy nr.1

0

W kodzie Form2 musisz miec publiczna zmienna form1 typu Form. Posluzy ona do zmiany wartosci zmiennych w Form1.

public partial class Form2 : Form
    {
        public Form form1; 

        ...
     }

Kiedy tworzysz nowe okienko Form2 z poziomu Form1 poprzez klikniecie buttona musisz przypisac aktualna forme do publicznej zmiennej form1 w Form2:

 

//zdarzenie wywolywane w Form1
private void Button1_Click(object sender, EventArgs e)
        {
            Form2 drugiFormularz = new Form2();
            drugiFormularz.form1 = this; //przekazanie aktualnego formularza do Form2
            drugiFormularz.Show(); //wyswietlenie niemodalnego okna
        }

Teraz masz dostep do Form1 z poziomu Form2:

 
//zdarzenie wywolywane w Form2
private void Button1_Click(object sender, EventArgs e)
        {
           form1.Text = "bla bla bla"; //zmiana nazwy Form1
        }

Odsylam poraz kolejny do artykulu, do ktorego dawalem juz linka.

0

Dobrym nawykiem moim zdaniem przekazywania referencji do innego Form-a jest robienie to za pomocą konstruktora:

public partial class Form2 : Form
    {
        Form form;

        public Form2(Form form)
        {
            InitializeComponent();
            this.form = form;
        }
    }

Gdy tworzymy obiekt Klasy Form2 w Form1:

Form2 form = new Form2(this);

Od razu widzimy, że należy przekazać referencję w argumencje konstruktora, a w sposobie wyżej zauważamy dopiero podczas działania programu, że nalezało przekazać referencje polu typu Form ;)

0

Kurtth twój sposób jest dobry nawet by mi pasował, ale...
W formie2 odwołuję się do komponentów form1 a gdy robię twoim sposobem to mam coś takiego:
System.Windows.Forms.Form' does not contain a definition for 'szerokosc'

0

Bo odwolujesz sie do czegos, co zwyczajnie nie istnieje. Umiemy angielski?

0

Właśnie o tym napisałem, że wszystko było by pięknie ale...
Odwołanie się do czegoś co nie istnieje nie jest możliwe.

0

Kontrolkę, którą chcesz modyfikować ustaw jako publiczną. W Properties ustaw Modifiers na public.

0

Czytając wasze posty i nie mogąc wyszukać odpowiedzi na swój problem postanawiam poszukać pomocy u was:

Pisze program , gdzie form1 jest oknem głównym programu mam takie pomysł:
aby wynik kodu z form2 nie wyświetlał się w nowym oknie form2 po przyciśnięciu przycisku lecz , po wykonaniu tej ostatniej czynności oknie ListView które znajduje się w form1 załadowało to co znajduje się w form2. Jak ten problem rozwiązać.

0

Przekazac referencje ListView z Form1 do Form2.

//kod Form2

ListView LVForm1;

//przekazanie referencji
public Form2(ListView lv)
{
         LVForm1 = lv;
}

...

//zdarzenie klikniecia
public void button_Click (object sender, EventsArgs e)
{
        ListViewItem item //i dalej kod dodania nowego itema
        LVForm1.Items.Add(item);
}
//kod Form1

Form2 drugi = new Form2(this.ListView);

Pisane z palca.

0

Mendoza ja rozumiem że jak bede chciał zrobić Przekazac zawartosć Form2 do ListView znajdujacego się w Form1 to tylko pozmieniać w kodzie numer form ?

0

Tak jak napisał Mendoza. Przekazujesz referencje kontrolki ListView z Form1 do Form2. Tym sposobem masz w Form2 dostęp do kontrolki z Form1 tak ja byś ja modyfikował w Form1.

Pozwolę sobie napisać bardziej szczegółowy kod:

    //Form2
    public partial class Form2 : Form
    {
        ListView lvwLista;
        
        public Form2(ListView lvwLista)
        {
            InitializeComponent();
            this.lvwLista = lvwLista;
        }

        public void button_Click (object sender, EventsArgs e)
        {
            //kod dodania nowego itema
            lvwLista.Items.Add(...);
        }
    }

    //Form1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 nowyForm = new Form2(lvwLista);
        }
    }
0

Witam!
Przeczytałem już sporo postów proponujących różne rozwiązania w sposobie przekazywania zmiennych, ale nigdzie nie znalazłem informacji w jaki sposób przekazywać większą liczbę wartości. O co mi chodzi?
Już tłumaczę...

Mam w sumie 4 formy. Dla jasności i klarowności sytuacji nazwijmy je kolejno: A, B, C i D.

  1. Udało mi się przekazać kolejne wartości ListView z formy A do listboxów w formie B.
    Przekazywanie realizuję za pomocą kodu:

B myForm = new B();

zadeklarowanego w formie A.
W formie B wykonuję obliczenia w formie B na podstawie informacji z listboxów.
Chciałbym wynik tych obliczeń przekazać z powrotem do formy A.
Widziałem, że Mendoza napisał fajnych przykład z wykorzystaniem this, ale zmienia tam tekst wyświetlany w nagłówku formy, a jak zmienić wartość jakiejś kontrolki (np. label) w formie A?

  1. W jaki sposób przekazać wartości z form A i C do formy D?
    Z A do D, mógłbym tak samo jak z A do B, ale jak dodać jeszcze z C do D?

Z góry dziękuję Wam za pomoc.
Pozdrawiam ;)

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