NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C# WPF Aktualizace dat zapsaných v metodě v jiné třídě

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ježek Vít :26.3.2016 23:50

Ahoj, možná drobnost. Mám aplikaci WPF C#.
Jedno základní okno v kterém je datagrid, textbox, textblock. V těch mám napojená data z databáze (o uživatelích). To je OK.
Pak mám vytvořené nové okno přes Button -> v novém okně zadám informace o uživateli (jméno apod..) -> tam po kliknutí na Button vložím nově získané informace do databáze. Také OK.
Problém je po zavření druhého okna (kde se vkládají nové hodnoty) a přechodu na hlavní okno s celkovým seznamem uživatelů. Nedaří se mi ani datagrid, ani textbox/textblock aktualizovat o nově vytvořená data. Jediná možnost je restartovat program. Pak tam jsou.
V hlavním okně mám vytvořenou metodu

public void BindGrid()

kde mám funkční kód pro vložení dat. Ze druhého okna (kde zadávám nová data) volám

HlavniOkno hlavniOkno = new HlavniOkno();
hlavniOkno.BindGrid();

Jo a všechno má stejný namespace
Nějaký nápad?

Odpovědět
26.3.2016 23:50
Nemyslím, tedy nejsem.
Avatar
Odpovídá na Ježek Vít
Michal Štěpánek:27.3.2016 12:28

Můžeš si třeba poslat do toho druhého okna instanci toho hlavního a po uložení nového záznamu spustit "znovunaplnění" gridu v hlavním okně...

Nahoru Odpovědět
27.3.2016 12:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Ježek Vít
Michal Štěpánek:27.3.2016 12:37

Já to obecně páchám takto:
V příslušné třídě naplním ObservableCollec­tion daty z databáze
V hlavním okně vytvořím třeba

public void NactiData()
{
//zde je příkaz třídě, aby naplnila kolekci
trida.naplnkolekci();
DataGrid.DataContext = trida;
}

přes binding naplním DataGrid tou kolekcí z třídy
Do "ukládacího" okna si pošlu instanci hlavního okna (kde mám ten DataGrid), to si otevírám jako dialog. Tím pádem mohu spustit ten "public void" z hlavního okna a před uzavřením tohoto okna spustím naplnění DataGridu v tom hlavním okně...
Nevím jestli je to nejideálnější řešení, ale jiné zatím neumím...

Editováno 27.3.2016 12:39
Nahoru Odpovědět
27.3.2016 12:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Ježek Vít :27.3.2016 23:14

To by mohlo fungovat. Jen se optám, jak spustíš v hlavním okně to druhé okno?

DruheOkno druheokno = new DruheOkno();
druheOkno.ShowDialog();

?
A jakou hlavičku vytvoříš v druhém okně?

public DruheOkno()
{
InitializeComponent();
.....

?

Nahoru Odpovědět
27.3.2016 23:14
Nemyslím, tedy nejsem.
Avatar
Odpovídá na Ježek Vít
Michal Štěpánek:27.3.2016 23:46
DruheOkno druheokno = new DruheOkno(this);
druheOkno.ShowDialog();

druhé okno

private HlavniOkno form;
Public DruheOkno(HlavniOkno instance)
{
InitializeComponent();
this.form = instance;
}

a pak v tom DruheOkno můžu spustit akci z hlavního okna

this.form.NejakaAkce();
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.3.2016 23:46
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Ježek Vít :29.3.2016 18:00

Tak nemohu říct, že to nefunguje :-)
Jen (ač nemám ponětí proč) se DataGrid někdy aktualizujE a někdy zase ne.
Každopádně tvé řešení je řešení, jen musím ještě někde vychytat chybičku.
Díky

Nahoru Odpovědět
29.3.2016 18:00
Nemyslím, tedy nejsem.
Avatar
Odpovídá na Ježek Vít
Michal Štěpánek:29.3.2016 21:41

Nevím, z čeho plníš ten DataGrid, ale pokud např. z ObservableCollec­tion jako já, tak ji nezapomeň vždycky před naplněním vyprázdnit, jinak se aktualizované záznamy jakoby "připíšou" za již načtená data a v DataGridu se na první pohled nic nezmění, ale data se zobrazí, resp. přidají znovu na konci...

Nahoru Odpovědět
29.3.2016 21:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Ježek Vít :29.3.2016 22:04

K naplnění DataGridu používám

OleDbCommand cmd = new OleDbCommand();
if (con.State != ConnectionState.Open)
    con.Open();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM [Osoby] ORDER BY Prijmeni ASC";
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
dt = new DataTable();
da.Fill(dt);
DataGridOsoby.ItemsSource = dt.AsDataView();

Problém s duplicitou dat při načtení nového seznamu (i bez vyprázdnění) nemám. Je tam vždy jen jeden seznam.

Pořád zkouším přijít proč se někdy aktualizuje a jindy ne, ale ne a ne na to přijít. Každopádně pokud na to příjdu, tak dám vědět. I kdyby pro zajímavost.

Nahoru Odpovědět
29.3.2016 22:04
Nemyslím, tedy nejsem.
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 8 zpráv z 8.