Diskuze: pristup k premennej typu DataTable z inych tried (ukazka kodu)
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Michal Štěpánek:29.3.2015 11:58
Myslím si, že DataTable bys měl vytvořit ve třídě a ve formu se na ní jen přes tu třídu odkazovat.
Filip:29.3.2015 16:07
OK, spravil som to takto:
Tabulka.cs
public static class Tabulka
{
public static DataTable DT;
}
... potom sa v ostatnych triedach na tuto premennu odkazujem "Tabulka.DT"
Funguje to, ale neviem ci je to optimalne riesenie.
OK.... ide mi o to, ze ked mam SQL tabulku ktora ma cca 1000 riadkov po 20 stlpcov, aby sa ta tabulka nenacitavala do RAMky po 3x (v troch roznych premennych) - aby ten program nezozral celu volnu pamat (sice neviem, ako .NET pracuje s datami za behu programu, ale pre istotu...)
Michal Štěpánek:30.3.2015 9:28
Netahej do toho zbytečně statiku. Prostě v té třídě, kde taháš data z databáze udělej
public datatable dt;
, dej do ní data a pak ve formu se na ní odkaž
private void Form1_Load(object sender, EventArgs e)
{
spravcaOsob.NacitajTabulku();
dataGridView1.DataSource = spravcaOsob.dt;
}
+20 Zkušeností
+2,50 Kč

Michal Štěpánek:16.4.2015 13:15
Jen jsem to napsal špatně, v té třídě to má být
public DataTable dt = new DataTable();
jinak pak bude křičet, že objekt nemá instanci, protože před každým "znovunatažením" dat, bys měl udělat
dt.clear();
aby se ti nezobrazovaly duplicitní záznamy...
Zacyklil som sa do dalsej blbosti, ne zeby som to nevedel vyriesit inak, ale
kedze som nad tym stravil cely vecer (cca 6 hodin ) tak ma zaujima preco to
nefunguje. Problem je ten, ze v "HlavnyForm" mam povodny obsah dat. zlozky
"db.tabulka". Ta premenna sa nechce po pridani noveho zaznamu aktualizovat.
Pritom vo forme "PridajOsobuForm" je to OK. Dufam ze z kodu to bude jasne.
public partial class HlavnyForm : Form
{
praca_sDB db;
public HlavnyForm()
{
InitializeComponent();
}
private void HlavnyForm_Load(object sender, EventArgs e)
{
db = new praca_sDB;
db.NacitajTabulku(); // do "public DataTable tabulka" nacita
tabulku z SQL databazy.
DataGridView1.DataSource = db.tabulka; // tabulka zobrazena, OK.
}
private void novyBut_Click(object sender, EventArgs e)
{
PridajOsobuForm pridajOsobu = new PridajOsobuForm();
// zobrazi novy form, v ktorom sa z TextBoxov ulozia udaje do SQL DB.
if (pridajOsobu.ShowDialog() == DialogResult.OK)
{
// v tomto bode zaznam ulozeny a "db.tabulka" je znovu naplnena z SQL DB.
db.tabulka.AcceptChanges(); // bez vysledku
DataGridView1.Update();
DataGridView1.Refresh();
DataGridView1.DataSource = db.tabulka; // ***tu je problem,
v "db.tabulka" nieje pridany novy riadok. Tabulka sa neaktualizovala.
}
}
}
//////////////////////////////
public partial class PridajOsobuForm : Form
{
//
}
public PridajOsobuForm()
{
InitializeComponent();
}
private void ulozButton_Click(object sender, EventArgs e)
{
praca_sDB db;
if (!ValidateChildren())
DialogResult = DialogResult.None;
else
{
// nasleduje ukladanie dat z TextBoxov do SQL DB
using (db = new praca_sDB())
{
db.Uloz_zaznam(objekty ktore ukladam); // tato metoda
ulozi zaznam do SQL tabulky a zaroven nacita celu SQL tabulku do dat. zlozky "tabulka"
// v tomto bode je zaznam ulozeny v DB, "db.tabulka" obsahuje aj novy zaznam, vsetko je OK.
}
if (chyba pri ukladani)
{
// zobraz chybove hlasenie
DialogResult = DialogResult.None;
}
else
{
DialogResult = DialogResult.OK;
}
// vrati sa do "HlavnyForm", v tomto bode "db.tabulka" je stale OK.
}
}
Gramli:22.4.2015 12:16
Ta tabulka se nemeni v HlavnyForm ,protoze vytvaris ve PridajOsobuForm novou tridu pro praci s databazi a nikde promenou v HlavnyForm neaktualizujes.
Takhle by to mohlo jit:
public partial class HlavnyForm : Form
{
public praca_sDB db; // promena je public
public HlavnyForm()
{
InitializeComponent();
}
private void HlavnyForm_Load(object sender, EventArgs e)
{
db = new praca_sDB;
db.NacitajTabulku(); // do "public DataTable tabulka" nacita
tabulku z SQL databazy.
DataGridView1.DataSource = db.tabulka; // tabulka zobrazena, OK.
}
private void novyBut_Click(object sender, EventArgs e)
{
PridajOsobuForm pridajOsobu = new PridajOsobuForm();
// zobrazi novy form, v ktorom sa z TextBoxov ulozia udaje do SQL DB.
if (pridajOsobu.ShowDialog() == DialogResult.OK)
{
// v tomto bode zaznam ulozeny a "db.tabulka" je znovu naplnena z SQL DB.
db.tabulka.AcceptChanges(); // bez vysledku
DataGridView1.Update();
DataGridView1.Refresh();
DataGridView1.DataSource = db.tabulka; // ***tu je problem,
v "db.tabulka" nieje pridany novy riadok. Tabulka sa neaktualizovala.
}
}
}
public partial class PridajOsobuForm : Form
{
private HlavnyForm hlavnyForm; //vytvoris si promenou HlavnyForm
//
}
public PridajOsobuForm(HlavnyForm form) // do konstruktoru predas HlavnyForm
{
hlavnyForm = form; //nastavis HlavnyForm
InitializeComponent();
}
private void ulozButton_Click(object sender, EventArgs e)
{
if (!ValidateChildren())
DialogResult = DialogResult.None;
else
{
// nasleduje ukladanie dat z TextBoxov do SQL DB
using (hlavnyForm.db) //tady pristupujes k promene z hlavniho Formu
{
hlavnyForm.db.Uloz_zaznam(objekty ktore ukladam); // tato metoda
ulozi zaznam do SQL tabulky a zaroven nacita celu SQL tabulku do dat. zlozky "tabulka"
// v tomto bode je zaznam ulozeny v DB, "db.tabulka" obsahuje aj novy zaznam, vsetko je OK.
}
if (chyba pri ukladani)
{
// zobraz chybove hlasenie
DialogResult = DialogResult.None;
}
else
{
DialogResult = DialogResult.OK;
}
// vrati sa do "HlavnyForm", v tomto bode "db.tabulka" je stale OK.
}
}
Michal Štěpánek:22.4.2015 23:12
stačí toto
if (pridajOsobu.ShowDialog() == DialogResult.OK)
{
// v tomto bode zaznam ulozeny a "db.tabulka" je znovu naplnena z SQL DB.
db.tabulka.AcceptChanges(); // bez vysledku
DataGridView1.Update();
DataGridView1.Refresh();
DataGridView1.DataSource = db.tabulka; // ***tu je problem,
v "db.tabulka" nieje pridany novy riadok. Tabulka sa neaktualizovala.
}
změnit takto
if (pridajOsobu.ShowDialog() == DialogResult.OK)
{
// v tomto bode zaznam ulozeny a "db.tabulka" je znovu naplnena z SQL DB.
db.NacitajTabulku(); //tím se provede znovunačtení dat do datatable
DataGridView1.DataSource = db.tabulka;
}
Filip:23.4.2015 12:06
Diky, funguje to. Ale musel som este doplnit parameter "this" do konstruktora formulara "PridajOsobuForm".
PridajOsobuForm pridajOsobu = new PridajOsobuForm(this);
Filip:23.4.2015 12:31
Ano, staci. Existuje viacero sposobov aby to fungovalo, ale mna zaujimalo, preco ta "db.tabulka" v hlavnomForme sa zobrazuje bez zmeny, ked v skutocnosti obsahuje aj posledny pridany zaznam, teda vsetky data z DB.
btw. takto ako si to navrhol, program by pracoval takto:
Vytvor pripojenie k DB -> Otvor DB -> Uloz zaznam do DB -> Zatvor DB ->
Zrus pripojenie -> Vytvor pripojenie k DB -> Otvor DB -> Napln tabulku z DB ->
Zatvor DB -> Zrus pripojenie.
Preto som to chcel zoptimalizovat asi takto:
Vytvor pripojenie k DB -> Otvor DB -> Uloz zaznam do DB -> Napln tabulku z DB ->
Zatvor DB -> Zrus pripojenie.
Ja viem, pocitaci to je jedno
Michal Štěpánek:23.4.2015 23:38
Zjednodušit by se to asi dalo, musel by sis naplnit datatable ve stejném
kroku, když se ukládá záznam, ale myslím, že je to zbytečné...
Ten krok
db.NacitajTabulku();
bys musel volat přímo v té proceduře ukládání
Zobrazeno 14 zpráv z 14.