Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[c#] DataGridView Update

[es] :: .NET :: .NET Desktop razvoj :: [c#] DataGridView Update

[ Pregleda: 4155 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

AMD guy
Miroslav
.NET developer

Član broj: 128930
Poruke: 1007

Sajt: www.its.edu.rs


+38 Profil

icon [c#] DataGridView Update03.07.2009. u 10:42 - pre 179 meseci
U DataGridView ucitavam podatke iz baze preko moje metode koje sam napravio, e sad posle uspesne promene podataka u Datagridu update-ujem podatke u bazi, ali mi tu promenu ne prikazuje u DataGridView-u, nego moram da zatvorim i ponovo otvorim formu da bi video rezultate. Moje pitanje je kako da se posle uspesnog update-a refreshuje datagrid da bi video izmene.
http://i.imgur.com/V3feW.jpg
http://on.wsj.com/H9yjz6 -- India Graduates Millions, but Too Few Are Fit to Hire
 
Odgovor na temu

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 271
*.lanaco.com.



+1 Profil

icon Re: [c#] DataGridView Update06.07.2009. u 07:56 - pre 179 meseci
Ako ti je DataSource DataGridView-a neki DataTable ili DataSet trebao bi recimo kad radis Insert dodati red i u DataTable ili ponovo ucitati svjeze podatke iz baze pa onda pozvati DataGridView.Refresh()
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
 
Odgovor na temu

VBscout

Član broj: 30993
Poruke: 34



Profil

icon Re: [c#] DataGridView Update30.12.2010. u 09:31 - pre 161 meseci
Isti problem, pokusavam resiti kao sto je predlozio @logic_rabbit preko ucitavanja svih podataka iz osvezene baze.
Kao DataSource za DataGridView koristim DataSet, a za DataGridView je uradjen BindingSource ka tabeli u bazi koja ima recimo dve kolone(jednu tipa int - primarni kljuc, i drugu tipa varchar).

Za rad sa bazom napisao sam posebnu klasu u kojoj koristim LINQ,medjutim meni osvezavanje u DatGridView-u radi samo prvi put nakon sto korinsik odobri izmenu.

Izmenu radim na sledeci nacin:
Code:
    
    Tabela1 novaTabela = new Tabela1();
    novaTabela.arg1 = int.Parse(textBox1.Text);
    novaTabela.arg2 = textBox2.Text;
    
    //b.Izmeni(t1, novaTabela);
    b.Obrisi(t1);
    b.Dodaj(novaTabela);

Nakon sto se uradi izmena u bazi na glavnoj formi gde se nalazi DataGridView uradim sledece:
Code:

dataGridView1.DataSource = tabela1BindingSource;
tabela1BindingSource.DataSource = baza1.vratiSve();
dataGridView1.Refresh();

a metoda koja vraca sve redove iz tabele je:
Code:

public IEnumerable<Tabela1> vratiSve(){
    var sve = from data in dataContext.Tabela1s select data;
    return sve;
}

Gde pravim gresku?
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: [c#] DataGridView Update30.12.2010. u 22:18 - pre 161 meseci
Ja to radim ovako:

Napravim biznis objekat koji implementira interfejs INotifyPropertyChanged (da bi svaka promena property-ja bila vidljiva na GUI-u) i koga dekorišem sa atributom Serializable (da bih mogao da ga šetam između slojeva).
U Data Sources kreiram novi data source od tog objekta. Za taj data source izaberem DataGridView i prevučem na formu, a Visual studio sam izgeneriše data grid view, binding source, itd.

Ukoliko mi repozitorijum vraća IList<Foo>, onda za binding source vezujem BindingList<Foo>:

Code:
var list = _repository.GetList(); // returns IList<Foo>
_dataSource = new BindingList<Foo>(list);
fooBindingSource.DataSource = _dataSource;

Posle je samo potrebno pozvati _repository.Save(...), a magija će uraditi svoje :)
Nema potrebe zvati DataGridView.Refresh(), ponovo settovati data source i tome slično.
 
Odgovor na temu

VBscout

Član broj: 30993
Poruke: 34



Profil

icon Re: [c#] DataGridView Update31.12.2010. u 07:54 - pre 161 meseci
Hvala Dejane na odgovoru i predloženom rešenju,

ali u ovom trenutku to ne bih znao uraditi pošto ne znam dosta stvari (pre svega rad sa biznis objektima,...),
ali ću početi da učim, možda čak i odmah ako uskoro ne pronađem neko drugo jednostavnije rešenje (zbog vremenskog ograničenja za izradu programa).
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: [c#] DataGridView Update01.01.2011. u 15:26 - pre 161 meseci
Citat:
Dejan CarićNapravim biznis objekat koji implementira interfejs INotifyPropertyChanged (da bi svaka promena property-ja bila vidljiva na GUI-u) i koga dekorišem sa atributom Serializable (da bih mogao da ga šetam između slojeva).


Sto je u prinicipu losa praksa, da objekat iz biznis sloja bude odgovoran za osvezavanje korisnickog interfejsa. Te dve stvari nemaju veze. Bolje napravi jedan objekat na klijentu koji odgovara objektu iz sloja biznis logike i na njemu implementiraj INotifyPropertyChanged.
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: [c#] DataGridView Update01.01.2011. u 17:18 - pre 161 meseci
Napraviti kopiju istog takvog objekta samo da ne bi implementirao INotifyPropertyChanged? Zanimljivo...
Da li može neki link na ovu temu? Baš me zanima zašto je to loša praksa.

A takođe mi nije jasno šta si želeo da kažeš sa ovim:
Citat:

Sto je u prinicipu losa praksa, da objekat iz biznis sloja bude odgovoran za osvezavanje korisnickog interfejsa

Biznis objekat nema nikakvu referencu na View, tako da ne znam kako može biti odgovoran za osvežavanje istog.
DataGridView kontrola s razlogom osluškuje PropertyChanged event. Ti možeš napraviti svoju implementaciju DataGridView kontrole, koja ne osluškuje ovaj event, pa da vidim kako će to biznis objekat biti zadužen za osvežavanje tvoje kontrole.

[Ovu poruku je menjao Dejan Carić dana 01.01.2011. u 18:37 GMT+1]
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: [c#] DataGridView Update03.01.2011. u 20:42 - pre 161 meseci
Citat:
Dejan Carić: Biznis objekat nema nikakvu referencu na View, tako da ne znam kako može biti odgovoran za osvežavanje istog.
DataGridView kontrola s razlogom osluškuje PropertyChanged event.
Sam si sebi odgovorio. Implementiras interfejs u objektu iz sloja poslovne logike da bi neki grid znao da se osvezi. Tako sutra mozes da implementiras neki drugi interfejs zato sto ti je to bas zgodno zbog nekog novog scenarija u korisnickom interfejsu, pa onda neki treci interfejs zbog baze.. i onda imas klase koje se istovremeno bave i poslovnom logikom i GUIjem i ko zna cime jos.
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: [c#] DataGridView Update04.01.2011. u 00:52 - pre 161 meseci
Ja ne govorim o N interfejsa koje je potrebno implementirati, vec o INotifyPropertyChanged i recimo IDataErrorInfo, koji se upotrebljavaju u 99% slucajeva kada su desktop aplikacije u pitanju. Ti predlazes da je bolje napraviti kopiju takvog objekta i uvesti jos jedan sloj ili metodu koji ce biti zaduzeni za mapiranje objekata.
Po meni je to potpuno bespotrebno jer:
- Radis trodupli posao, a time i povecavas sansu za greske u kodu
- Komplikujes odrzavanje/nadogradnju

Ukoliko si imao negativna iskustva sa ovim interfejsima, mogao bi da ih podelis s nama.
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: [c#] DataGridView Update04.01.2011. u 22:16 - pre 161 meseci
Citat:
Dejan Carić: Ja ne govorim o N interfejsa koje je potrebno implementirati, vec o INotifyPropertyChanged i recimo IDataErrorInfo, koji se upotrebljavaju u 99% slucajeva kada su desktop aplikacije u pitanju. Ti predlazes da je bolje napraviti kopiju takvog objekta i uvesti jos jedan sloj ili metodu koji ce biti zaduzeni za mapiranje objekata.
Po meni je to potpuno bespotrebno jer:
- Radis trodupli posao, a time i povecavas sansu za greske u kodu
- Komplikujes odrzavanje/nadogradnju

Ukoliko si imao negativna iskustva sa ovim interfejsima, mogao bi da ih podelis s nama.
nema jos jednog sloja - INotifyPropertyChanged se implementira na klijentu. odrzavanje se nece zakomplikovati jer ces smanjiti kompleksnost objekta u BL sloju, a novi objekat koji pravis na klijentu je vrlo jednostavan. na taj nacin svaki sloj je izolovan i nemas tragove koda koji je vezan samo za klijenta u poslovnoj logici. sa pomenutim interfejsom jedino negativno iskustvo su stringovi koji srecu kvare kad se promeni ime propertija
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: [c#] DataGridView Update08.01.2011. u 14:14 - pre 160 meseci
Nije mi jasno kako to implementiraš pa ako bi mogao malo da pojasniš.

Recimo da imam sledeću klasu:

Code:

namespace Core.Model
{
    public class Customer : INotifyPropertyChanged
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set
            {
                if (_id != value)
                {
                    _id = value;
                    OnPropretyChanged("Id");
                }
            }
        }
    }
    ...
    public BindingList<Order> Orders { get; set; }
    ...
}

Pretpostavljam da bi ti od toga napravio nešto ovako:
Code:

namespace Core.Model
{
    public class Customer
    {
        public int Id { get; set; }
        ...
        public IList<Order> Orders { get; set; }
        ...
    }
}

Kako izgleda ta klasa koju bi pravio na klijentu?
Kada dodaš nove order-e i snimiš ih u bazu, oni dobijaju neki novi ID (recimo da je to auto increment polje).
Na koji način menjaš serverski ID sa ID-em na klijentu?

 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: [c#] DataGridView Update12.01.2011. u 19:18 - pre 160 meseci
Pored INotifyPropertyChanged, tvoj klasa koristi i BindingList, sto takodje pripada klijentu. Ja bih za potrebe komunikacije sa klijentom imao CustomerDto klasu koja izgleda kao sto si predlozio, a na klijentu bih imao, kao deo apstrakcije view-a, klase koje su pogodne za databinding i implementiraju INotifyPropertyChanged i koriste BindingList i sta vec treba. Na taj nacin svaka klasa ima samo jednu odgovornost, sto ih pojednostavljuje i olaksava razvoj.
Serverski Id ne bih menjao nekim novim, jer za to nema potrebe.
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: [c#] DataGridView Update12.01.2011. u 21:09 - pre 160 meseci
Ma sve je to cool, ali kada je brzina razvoja u pitanju, spreman sam da napravim neke kompromise.

Citat:
ravni: Pored INotifyPropertyChanged, tvoj klasa koristi i BindingList, sto takodje pripada klijentu. Ja bih za potrebe komunikacije sa klijentom imao CustomerDto klasu koja izgleda kao sto si predlozio, a na klijentu bih imao, kao deo apstrakcije view-a, klase koje su pogodne za databinding i implementiraju INotifyPropertyChanged i koriste BindingList i sta vec treba.

Po meni je ok koristiti DTO klase samo u slučaju kada pišem isključivo web aplikaciju, i to zbog neke lepote kodiranja, a vremena ima na pretek.
Ukoliko je potrebno napraviti model za desktop aplikaciju (nebitno da li je i za web u isto vreme), tada bih pravio isključivo klasu koju sam naveo u prethodnom postu.

Zašto?

U knjizi Data Binding with Windows Forms 2.0 - Programming Smart Client Data Applications with .NET, u 9. poglavlju se kaže:
"The BindingList<T> type should actually be your first choice for collections of objects that you intend to use for data binding."

Rocky Lhotka u svom čuvenom CSLA.NET framework-u, takođe koristi BindingList<T>. A kako i zašto, detaljno opisuje u svojoj knjizi Expert C# 2008 Business Objects.

Ako mi za desktop aplikaciju treba BindingList<T>, DTO klase mi apsolutno ne trebaju i donose više "štete" nego koristi jer:
- Kada promenim DTO, moram da promenim i BO.
- Kada promenim DTO, moram da promenim i metode koje mapiraju DTO u BO i obrnuto.

Citat:
ravni:Na taj nacin svaka klasa ima samo jednu odgovornost, sto ih pojednostavljuje i olaksava razvoj.

Kad kažeš da su BO klase zadužene za osvežavanje korisničkog interfjesa, ja to ipak gledam na drugi način. Ali razvoj može samo da iskomplikuje, nikako da olakša.
Razumem da bi primena INotifyPropertyChanged interfejsa u web aplikacijama bila samo overhead, jer su web aplikacije stateless... ali ako jedan Stackoverflow može da koristi Linq2Sql (izgenerisani model nasleđuje ovaj interfejs), zašto bi se onda toliko brinuli oko toga?

Citat:
ravni:Serverski Id ne bih menjao nekim novim, jer za to nema potrebe.

Ovo je bio lapsus. Hteo sam da kažem da se klijentski id zameni sa serverskim. A za to je potrebna metoda koja vrši mapiranje DTO u BO i obrnuto.

 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: [c#] DataGridView Update13.01.2011. u 20:44 - pre 160 meseci
Citat:
Ma sve je to cool, ali kada je brzina razvoja u pitanju, spreman sam da napravim neke kompromise.
Kompromis je najcesce nuzan, vazno je samo dobro odmeriti gde ga treba naciniti. Mislim da se odredjeni gubitak vremena u ranoj fazi kasnije visestruko vrati kroz dekaplovan kod koji je lakse odrzavati i prosirivati novim funkcionalnostima.
Citat:
"The BindingList<T> type should actually be your first choice for collections of objects that you intend to use for data binding."
Apsolutno se slazem sa ovim. Samo sto je databinding stvar prezentacionog sloja, a ne BL sloja.
CSLA nazalost nisam imao prilike da koristim, cuo sam da ga hvale.
Citat:
Kada promenim DTO, moram da promenim i BO.
I, to je posao od koliko sekundi?
Citat:
Kada promenim DTO, moram da promenim i metode koje mapiraju DTO u BO i obrnuto.
I ovo je trivijalan zadatak. Cak ako se pomognes nekim object mapping alatom, ne moras ni da vodis racuna o ovoj stavci.
Poenta je da su klase koje koristis jednostavne, a efekti izmena koje nacinis na njima predvidivi.
Citat:
ali ako jedan Stackoverflow može da koristi Linq2Sql (izgenerisani model nasleđuje ovaj interfejs), zašto bi se onda toliko brinuli oko toga?
Svako je slobodan da radi na nacin koji smatra da je najbolji. Iako je SO odlican sajt, to ne znaci nuzno da je kod koji ga pokrece idealan.

Ovo poslednje sto si pomenuo oko ID-ova i dalje ne razumem.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: [c#] DataGridView Update

[ Pregleda: 4155 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.