C# - obnovení datagridview z jiného formu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# - obnovení datagridview z jiného formu – .NET – Fórum – Programujte.comC# - obnovení datagridview z jiného formu – .NET – Fórum – Programujte.com

 

Rastlyn0
Duch
24. 1. 2015   #1
-
0
-

Zdravím,

mám nejspíš úplně triviální problém:
Mám dva formuláře v prvním z nich je datagridview v druhém z nich je kontaktní formulář, po jeho vyplnění se mi uloží do databáze, ale nepříšel jsem jak tyto data dostat do datagridview, kromě restartování aplikace.

Předem děkuji za Váš čas.

Nahlásit jako SPAM
IP: 178.213.41.–
Mutagen
~ Anonymní uživatel
549 příspěvků
26. 1. 2015   #2
-
0
-

Co takhle použít refresh? Po uzavření formu by jsi znova načetl data?

Nahlásit jako SPAM
IP: 212.47.26.–
Matěj Andrle+1
Grafoman
26. 1. 2015   #3
-
0
-

#1 Rastlyn
OOP - kdybys jej dodržoval... GUI odstav od logiky. Pak nebudeš mít logiku uvnitř grafiky - uvnitř formuláře! Založ tedy konzolovou aplikaci a pak knihovnu. Do referencí konzolové apky dej Core/Kernel - prostě tu knihovnu s logikou - já to vždy nazývám Core.dll... A z konzole udělej GUI (Windows Application) - v nastavení. Tím dosáhneš maximálního oddělení GUI od logiky. V jádru - knihovně budeš mít jen logiku a v projektu GUI zase jen grafiku. No a to už je jen krůček k tomu manipulovat se všemi stránkami GUI z Program.cs - z Main statické metody. Příklad:

using System.Windows.Forms;
using System.Drawing;
using System;

namespace Respick
{
	static class Program
	{
		[STAThread]
		static void Main()
		{
			Font bigFont = new Font("Segoe UI", 21.6F, GraphicsUnit.Pixel);
			Form mainForm = new Form
			{
				Font = new Font("Segoe UI", 14.4F, GraphicsUnit.Pixel),
				StartPosition = FormStartPosition.CenterScreen,
				ClientSize = new Size(346, 480),
				KeyPreview = true,
				Text = "Respick"
			};

(...)

			new Label
			{
				Parent = mainForm,
				Text = "Šipka vlevo",
				Location = new Point(250, 370),
				ForeColor = Color.FromArgb(153, 153, 153)
			};
			new Label
			{
				Text = "Posun vpravo",
				Parent = mainForm,
				Location = new Point(250, 390),
				ForeColor = Color.FromArgb(102, 102, 102)
			};
			new Label
			{
				Parent = mainForm,
				Text = "Šipka vpravo",
				Location = new Point(250, 410),
				ForeColor = Color.FromArgb(153, 153, 153)
			};

(...)

			new Timer
			{
				Interval = 30,
				Enabled = true
			}.Tick += (sender, args) =>
			{
				tetris.HandleTimer();
				level.Text = "Level: " + tetris.Level;
				score.Text = "Skóre: " + tetris.Score;
			};

			Application.EnableVisualStyles();
			Application.Run(mainForm);
		}
	}
}


No a to je právě ono! Jak takto vytvoříš 2 Formuláře a spravuješ je z jedné metody, není nic snazšího, než přehazovat data mezi nimi... Pročež v logice - jádru aplikace máš jen co nejobecnější vyjádření. Například s oblibou vytvářím Action (totéž jako event) Draw. A tuto akci pak naplním až v GUI - v Main metodě. Tím mohu volat obecné Draw - třeba s nějakými parametry a GUI si to vykreslí vždy po svém. To mi umožňuje měnit GUI jako plenky. Prostě jen jinak naplním obecnou dynamickou metodu Draw... Přesně takto je OOP myšleno - takto se to má dělat. Ne nacpat vše do GUI a pak se divit, že je to jeden splácanec, který se nedá upravit, který se nedá portovat,... Logika má být stranou a má být prošpikovaná eventy/Akcemi/Funkcemi (Func - je dynamická metoda s návratem) a vlastnostmi. Nic jiného nemá koukat ven - zapečetění objektu. A v GUI pak jen doplníš grafiku - naplníš veškerá obecná volání - eventy atd. Tím může být ona logika provedena na jakémkoliv zařízení s jakoukoliv grafikou... Tzv. vrstvení aplikace. Zde by ti to umožnilo mít data v úplně jiném objektu než GUI. A z tohoto objektu bys jen předával určité vlastnosti. (Co nejvíce dat má být skryto, aby objekt nebyl zranitelný a naopak, aby se nestal dírou pro OS.)

Vždy mne napadají pro nesrozumitelné vyjadřování - tak se pokusím to ještě zpřehlednit:

Přestat používat VS designer atp. Vytvářet GUI z jediného zaujatého objektu - Program. Vše ostatní mít obecné! Tedy bez konkrétních dat, bez konkrétního provedení GUI. (Nevykreslovat nic v jakékoliv jiné části aplikace - nikde nemít ani MessageBoxy - nic.) Cokoliv chceš provést v GUI, tomu vytvoř v logice jen obecnou metodu. Například o chybě informuji pomocí vlastnosti typu Action - název  „ErrorMessage“/„ErrorDialog“/... A v GUI pak naplníš toto obecné volání třeba pomocí Console.WriteLine, nebo pomocí MessageBoxu, nebo ... A rovněž takto zacházej se vším jiným. V logice nemá být nic konkrétního - vše musí být obecné vlastnosti a proměnné. Konkrétní data doplní každá jiná aplikace. Tím jedno jádro můžeš použít v 10 projektech - to je základ OOP, základ tvého vlastního frameworku.

Nahlásit jako SPAM
IP: 78.136.164.–
Matěj Andrle+1
Grafoman
26. 1. 2015   #4
-
0
-

#1 Rastlyn
Raději přiložím ještě naprosto funkční ukázku, poněvadž si na mé chování zde stěžujete. (Přičemž se snažím jen pomoci.)

http://leteckaposta.cz/458562331

A takto má vypadat OOP:

http://leteckaposta.cz/787576322

Jak již jsem napsal - tím, že vytvoříš v jedné metodě instance 2 formulářů se dostáváš do pozice, kdy mezi oběma můžeš velice snadno sdílet data. Já osobně bych můj postup opepřil děděním Form a přidáním pár eventů, či jiných vlastností - aby zase vše nebylo nacpané jen v Main... (Já to tak dělám pro lenost - především však pro rozsah. U větších aplikací dělám ještě 3. vtrstvu - ta obsahuje nepřímou grafiku - mezivrstva. Tak redukuji velikost Program.cs, poněvadž v OOP by třída neměl mít více, než 300 řádků tuším.)

Nahlásit jako SPAM
IP: 78.136.164.–
karlicek
~ Anonymní uživatel
10 příspěvků
26. 1. 2015   #5
-
0
-

Koukam ze pan Matej tady zase mele neco okolo OOP a je myslenkove uplne mimo..

Rastlyne, Tobe staci, pokud datasource, ktery pouzivas v tom datagrid view, bude dedit od ObservableCollection, pripadne budes mit vlastni kolekci, ktera bude implementovat rozhrani INotifyCollectionChanged, INotifyPropertyChanged. Pokud je naimplementujes, formular automaticky pozna, ze se zmenila data a sam je za tebe updatuje ;) 

Pokud nevis jak na to, posli nam Tvuj kod

Nahlásit jako SPAM
IP: 193.245.36.–
Rastlyn0
Duch
26. 1. 2015   #6
-
0
-

Ok takže mám tento kód:

form 2(s kontaktním formulářem):

private void InsertButton_Click(object sender, EventArgs e)
{
	…
	form.refresh(…);  
}


A form 1(s datagridview):

public void refresh(…)
{
       CompanyDataset.Clear();
       CustomerTableAdapter.Fill(CompanyDataset.Customer);
       datagridview.refresh();
       //myslel jsem, že by stačilo tohle, ovšem nefunguje :D
}

Pokud pominu, že to mám špatně objektově napsané, co tedy musím udělat abych datagridview doopravdy obnovil. Prosím šetřete mně jsem začátečník :). Díky Rastlyn

Nahlásit jako SPAM
IP: 178.213.41.–
p3can
~ Anonymní uživatel
312 příspěvků
26. 1. 2015   #7
-
0
-

#4 Matěj Andrle
1. nevim proc meles o opp kdyz to co popisujes neni oop ale architektonicky vzor.

2. action sis suploval dependency injection, takze si rozbil SOLID (single class responsibility) a princip znovupouzitelnosti

3. ignoraci designeru tak leda ignorujes RAD

4. kdyz uz sme u toho tak tvuj tetris zabira ~550 radku kodu a co mam nejake svoje stare kody tak u me to zabira ~900 radku kodu stim ze je to ve 3 rozmerech.

ale co ja vim ja se tomu nevenuju 7 let ...

Nahlásit jako SPAM
IP: 77.92.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý