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.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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...)
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;
}
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.
}
}
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.
}
}
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;
}
Diky, funguje to. Ale musel som este doplnit parameter "this" do konstruktora formulara "PridajOsobuForm".
PridajOsobuForm pridajOsobu = new PridajOsobuForm(this);
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
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.