Avatar
Maros2470
Člen
Avatar
Maros2470:

Mám v aplikaci dva formuláře Form1 a Form2.
Do ListBoxu na Form 2 načtu data z xml a po selectListBox načtu do Textboxů na tomto formuláři.

Tato vybraná data potřebuji načíst také do Listboxů na Form1.
Nevím jak na to. Poradíte mi někdo?

 
Odpovědět 21.4.2014 16:06
Avatar
hanse
Člen
Avatar
hanse:

Jestli chápu dobře, tak vytváříš instanci formu2 ve formu1 (jestli ne, použij parametr metody)? Na to můžeš jít třeba tak, že:

  1. vytvoříš si model dat (public třídu s vlastnostma), které chceš přenést
  2. ve formu2 přidáš model jako vlastnost, např:
public MujModel ModelDat {get;set;}

3. ve formu2 naplníš model
4. form2 zavři metodou Close(), ne Dispose
5. ve formu1 včetně práce a předání modelu může vypadat např. následovně:

Form2 form = new Form2();
form.Model = new MujModel();
form.ShowDialog();
MujModel model = form.Model;
form .Dispose();
string praceSPromennouZModelu = model.MyProperty;
ZpracujModel(model);

(samozřejmě jsou i jiné způsoby a i kratší a pravděpodobně lepší způsoby zápisu, ale takto je to aspoň snad pochopitelné)

Editováno 21.4.2014 16:38
 
Nahoru Odpovědět 21.4.2014 16:37
Avatar
Odpovídá na Maros2470
Michal Žůrek (misaz):

jde to vyřešit i tak, že instanci ListBoxu na Form1 předáš Formu2.

void Form2(Listbox l) {
    this.l = l;
}
Form2 f = new Form2(this.nazevListboxu);
Nahoru Odpovědět 21.4.2014 19:10
Nesnáším {}, proto se jim vyhýbám.
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Maros2470:

To je jednodužší pro můj případ. Díky

 
Nahoru Odpovědět 21.4.2014 20:16
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Maros2470:

Teď jsem se teprve k tomu pořádně dostal a nerozumím tomu. můžeš podrobněji?

Příklad: mám na Form2 bankyDataGrid (Columns: Id, Banka a Kod), TextBoxy (idTextBox, bankaTextBox, kodTextBox) a tlačítko (preberButton).
Na Form1 mám TextBoxy (idTextBox, bankaTextBox, kodTextBox).

Po select na bankyDataGrid se mi na Form2 načtou data do TextBoxů.

Po stisku tlačítka preberButton potřebuji, aby se data z Form2 (TextBox) přenesly do Form1 (TextBox).

Poradíš mi jak na to? Potřebuji jen ten převod z Form2 do Form1

Editováno 3.5.2014 16:29
 
Nahoru Odpovědět 3.5.2014 16:28
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Do události click na tlačítko preberButton dáš:

Form1 f = new Form1(idTextBox.Text, bankaTextBox.Text, kodTextBox.Text);
f.Show();

a do Form1

//v závorce je konstruktor, který přijímá argument z Form2
public Form2(int id, string banka, string kod) //za předpokladu, že id je skutečně číslo můžeš dát int
    {
        InitializeComponent();
        //inicializace argumentů předaných z Form2
        idTextBox.Text = id;
        bankaTextbox.Text = banka;
        kodTextBox.Text = kod;
    }

taky jsem až dnes pochopil, jak to vlastně funguje... :-)

Editováno 3.5.2014 23:22
Nahoru Odpovědět 3.5.2014 23:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Vyhazuje mi to chybu na Form2:

 
Nahoru Odpovědět 4.5.2014 7:42
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

a jakou chybu konkrétně ti to píše? Máš v tom Form1 napsáno :

public Form1(int id, string banka, string kod) //za předpokladu, že id je skutečně číslo můžeš dát int
    {
        InitializeComponent();
        //inicializace argumentů předaných z Form2
        idTextBox.Text = id;
        bankaTextbox.Text = banka;
        kodTextBox.Text = kod;
    }

?

Editováno 4.5.2014 9:04
Nahoru Odpovědět 4.5.2014 9:01
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
 
Nahoru Odpovědět 4.5.2014 9:04
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

tam je sice chyba, ale není tam popis o jakou chybu se jedná...

edit: sorry, nekoukl jsem se až dolů.
ale to píše, když nemáš na tom Form1 přijímání těch parametrů nastaveno

public Form1(int id, string banka, string kod)
Editováno 4.5.2014 9:06
Nahoru Odpovědět 4.5.2014 9:05
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

V té mé první odpovědi jsem napsal sice dobře, že to máš napsat do Form1, ale pak jsem špatně uvedl

public Form2(...

Omlouvám se za mystifikaci :-)

Nahoru Odpovědět 4.5.2014 9:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Už to funguje. Nicméně Form1 je již otevřen a otevírá se znovu, což není dobré. Potřeboval bych, aby se Form2 zavřel (to není problém) a data se zobrazila ve Form1, když se Form2 zavře. Jak to udělat?

Editováno 4.5.2014 9:24
 
Nahoru Odpovědět 4.5.2014 9:24
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Kdy se ti otevře ten Form1 poprvé a hlavně proč?

Nahoru Odpovědět 4.5.2014 9:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Form1 se otevírá při spuštění a Form2 otevírám z něj. Možná to dělám složitě, ale začínám a asi jsem si ukousl velké sousto.

Jedná se práci s databází kde data jedné tabulky (např. Firma) doplňuji z jiné tabulky (např. Banky). Ve Form1 mám načtenou tabulku Firma a ve Form2 vybírám banku, kterou následně uložím do firmy.

 
Nahoru Odpovědět 4.5.2014 9:34
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Taky se v C# teprve učím, ale pokud ten Form1 je jako výchozí při spuštění, tak ho program bere jako "hlavní" a při jeho zavření se ukončí aplikace...
Kolik se ti tam vyskytuje Formů celkem? Nevyplatilo by se udělat z toho jednoho MDI kontejner jako hlavní a ty ostatní z něj otevírat jako podřízené formy? Pak by tento problém odpadl, protože ten Form1(s firmou) můžeš při otevření Form2 zavřít a pak už to funguje, jak jsem popsal výše...

Nahoru Odpovědět 4.5.2014 9:40
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Taky jsem nad tím uvažoval, v podstatě by to šlo, ale těch TexBoxů, přes které ukládám data do firmy je více a do nich potřebuji načíst data z více tabulek (jednatel, psč, zakázka, objednávka a pod). To bych musel pro každé nové načtení dělat Update tabulky a načítat po částech. Ideální je do všech TextBoxů postupně načíst data ze všech potřebných tabulek, doplnit o vpisovaná data a uložit. Stejně to funguje účetnictví, které jsem si koupil.

Editováno 4.5.2014 9:50
 
Nahoru Odpovědět 4.5.2014 9:49
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Asi jsem nějak nepochopil: "...TexBoxů, přes které ukládám data do firmy je více a do nich potřebuji načíst data z více tabulek..." Ukládáš data z jiných tabulek do tabulky Firmy? Pokud máš více tabulek, které jsou na sobě nějak závislé, je lepší je spojovat v tzv. propojovací tabulce, kde budou v podstatě jen klíče jednotlivých řádků z těch tabulek... Jinak budeš mít spoustu duplicitních dat a pak se v tom nakonec bude hodně těžké orientovat. Zárověň když provedeš změnu v nějaké tabulce, tak tu změnu budeš muset udělat i v dalších tabulkách a z toho by ses mohl pak opupínkovat.
Při použití propojovací tabulky provedeš změnu jen jednou a automaticky se ti promítně i do ostatních tabulek...

Nahoru Odpovědět 4.5.2014 10:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Gramli
Redaktor
Avatar
Gramli:

Doufám, že sem to správně pochopil:

Nemusel bys používat 2 formuláře, stačil by ti jeden, který něco zobrazuje a má velikost při načtení aplikace-> width: 500; height: 500; někde do této velikosti dáš button a když na něj klikneš formulář se ti zvětší na veliskost-> width: 900; height: 500; na pozicích větších jak 500 máš volné místo kde můžeš dávat editační prvky.

Suma sumárum, při spuštění aplikace editační prvky neuvidíš, jakmile klikneš na tlačítko, zvětší se ti formulář, kde editační prvky jsou :) (po dalším kliku na tlačítko se formulář zase zmenší)

Editováno 4.5.2014 10:38
Nahoru Odpovědět  +1 4.5.2014 10:37
Kdo to říká ten to je...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Mám tabulku Firmy kde mám např: Id, Ic, Firma, Ulice, Obec, CastObce, PscId, Psc, BankaId, Banka, KodBanky, CisloUctu a Telefon.
Dále mám tabulku Banky kde mám: Id, Banka, Kod.
Dále mám tabulku Psc kde mám: Obec, CastObce, Psc.

Na Form1 mám TextBoxy: Id(visible = false), ic, firma, ulice, obec, castObce, pscId(visible = false), psc, bankaId(visible = false), Banka, kodBanky, cisloUctu a telefon.

TextBoxy (ic, firma, ulice, cisloUctu, a telefon) vypíši ručně.
TextBoxy (pscId, obec, castObce a psc) chci načíst z tabulky Psc (Form3)
TextBoxy (bankaID, banka a kod) chci načíst z tabulky Banky (Form2)

Obsah všech TexBoxů uložím jako novou firmu do tabulky Firma.

Možná je to blbě

Editováno 4.5.2014 10:41
 
Nahoru Odpovědět 4.5.2014 10:38
Avatar
Maros2470
Člen
Avatar
Odpovídá na Gramli
Maros2470:

Asi tak jak to mám v účetnictví viz. obrázek

 
Nahoru Odpovědět 4.5.2014 10:45
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Když se na ten formulář podíváš lépe, pak zjistíš, že třeba kód banky nebo PSČ si můžeš vybrat z číselníku tzn., že banka nebo PSČ jsou uloženy v jiných tabulkách (číselnících) a do formulářů se jen načítají. Kdyby to tak nebylo a např. banka změnila kód (je to samozřejmě jen jako příklad), musel bys ten kód měnit u všech záznamů v tabulce firma. Při tisíci záznamů je to na sebevraždu.
Do tabulky firmy je uloženo jen ID té banky a číslo účtu...

Nahoru Odpovědět 4.5.2014 11:36
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Gramli
Redaktor
Avatar
Odpovídá na Maros2470
Gramli:

Tak na tohle je určitě lepší mít 2 formuláře...

K té změně záznamů tohle by se dalo udělat SQL příkazem update ne? Nemusel by nic měnit po jednom:)

Nahoru Odpovědět 4.5.2014 11:39
Kdo to říká ten to je...
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Mrkni se, kam ti to "účetnictví" ukládá data a pořádně si prohlídni strukturu té databáze, z toho bys měl pochopit, jak to funguje... :-)

Nahoru Odpovědět  +1 4.5.2014 11:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 24 zpráv z 24.