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

Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview

[es] :: .NET :: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview

[ Pregleda: 2059 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 12:51 - pre 172 meseci
Oba se ticu datagridview-a.

1. Imam zahtjev od korisnika da se u datagridview-u ENTER dugme ponasa kao TAB. Dakle, hoce da prelazi iz celije u celiju pritiskom na ENTER.
Nijesam bio lijen, trazio sam po netu, nasao sam jedno rjesenje, koje ne radi bas savrseno:

na keydown dogadjaj grida
Code:

if(e.KeyCode = Keys.Enter) e.Handled = true;

pa na keyup dogadjaj grida
Code:

if(e.KeyCode = Keys.Enter) SendKeys.Send("{Tab}");


Ovo radi kako treba kad prelazim iz celije u celiju bez editovanja iste. Ali, ako sam promijenio sadrzaj celije, ENTER se ponasa standardno, tj. oce u novi red. Tu sam batalio, mislio da ne moze nikako.

Onda sam nasao na MSDN-u neki clanak koji kaze da se to moze odraditi koriscenjem EDITCONTROLSHOWING dogadjaja grida (ali ne kaze kako), tu mogu da se dohvatim kontrole koju editujem, za vrijeme editovanja, pa mogu da joj dodijelim keydown i keyup handlere (koje inace ne mogu jer datagridviewcolumn objekat ne izlaze te dogadjaje).

Probao sam:
Code:

Control c = e.Control;
c.KeyDown += handler1;
c.KeyUp += handler2;

ali opet ne radi.

Sad, cini mi se da je ovo jako rasprostranjem problem, pa se nadam da mozda neko vec ima gotovo rjesenje...



2. Izvrsavam uskladistenu proceduru (radi nivelaciju cijena) u bazi koja generise oko 1000 zapisa i povlacim te zapise iz baze u aplikaciju. U prvom slucaju, dok jos nijesam bio definisao Expression kolone u DataSet-u, sve se zavrsavalo gotovo trenutno, izvrsavanje procedure, fill metod i imam podatke u gridu.
Sad, nakon definisanja nekoliko expressiona, procedura se zavrsi opet gotovo trenutno, ali nakon fill metode treba mu 5-6 sekundi da se podaci pojave u gridu. Kada uklonim expression kolone, sve se vraca na staro, brzo izvrsavanje.

Kada iz aplikacije otvaram vec gotovu nivelaciju (sa sve definisanim expressionima), pozivam fill metod neposredno pred otvaranje forme, forma se opet otvara trenutno, i nema nikakvih problema, tako da zakljucujem da je u pitanju datagridview, jer stvarno ne mogu da vjerujem da mu za sacicu proracuna treba 5-6 sekundi.

Glupo mi je da korisniku kazem, ajd' sad zatvori pa otvori da bi dobio podatke, a i bezveze je da program cuti 5-6 sekundi ako vec ne mora. Mozda bih mogao da pustim fill metod kroz drugu nit, ali to dosta komplikuje stvari i mozda izazvati dosta problema.

A datagridview nema suspendbinding metod koji bi pozvao prije fill i resumebinding posle fill, sto bi, cini mi se, pomoglo. Probao sam sa suspendlayout i resumelayout, ali ne pomaze. Ako uradim dispose neposredno prije fill, pomogne, ali ne mnogo, sekundu dvije.

Any ideas?


Pozdrav.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 13:20 - pre 172 meseci
Citat:

Ovo radi kako treba kad prelazim iz celije u celiju bez editovanja iste. Ali, ako sam promijenio sadrzaj celije, ENTER se ponasa standardno, tj. oce u novi red. Tu sam batalio, mislio da ne moze nikako.

Onda sam nasao na MSDN-u neki clanak koji kaze da se to moze odraditi koriscenjem EDITCONTROLSHOWING dogadjaja grida (ali ne kaze kako), tu mogu da se dohvatim kontrole koju editujem, za vrijeme editovanja, pa mogu da joj dodijelim keydown i keyup handlere (koje inace ne mogu jer datagridviewcolumn objekat ne izlaze te dogadjaje).

Probaj da napravis custom GridView tj. da nasledis klasu DataGridView i onda da handlujes ove evente kroz
neke od override metoda ( OnCellEnter,OnCellLeave, OnCellBeginEdit ... itd .. )
http://msdn.microsoft.com/en-u...orms.datagridview_methods.aspx

Citat:

2. Izvrsavam uskladistenu proceduru (radi nivelaciju cijena) u bazi koja generise oko 1000 zapisa .....

Kad imas 1000 zapisa i za svaki zapis i nije mozda sacica proracuna, opet sve zavisi od expression-a, broja kolona itd ..
Probaj da tu nivelaciju parcijalno da odradis (recimo po 10-20 zapisa) sa nekim next dugmicem
koji ce da pozove za sledecih 10-20 zapisa kao na primer neki paging pa vidi onda da li se nesto ubrzalo ..


Viva lollapalooza
 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
82.117.202.*



+6 Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 13:26 - pre 172 meseci
U sustini sve Data-intensive operacije trebalo bi da radis u posebnom threadu tako da GUI ostane responsive.
To sto sada imas 1000 zapisa i sto to traje 5 sekundi ne znaci da za godinu dana to nece da se udesetostruci pa ce
korisnici zaista biti nezadovoljni.
Posto radis WinForms imas zgodnu kontrolu BackgroundWorker koju mozes da iskoristis u ovom slucaju.

Pozdrav


Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

JoksosI
programer, DOCUS

Član broj: 190631
Poruke: 13
109.93.230.*



Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 13:48 - pre 172 meseci
e pa ovako, sto se tiče entera imaš dva načina:

Prvi jeste da pozivaš EditingControlShowing ali faktički služi da pretvoriš ćeliju u neku kontrolu pa u oviru nje da koristiš eventove:
(e sad, ja koristim vb.net)



dim tb as TextBox

'event tvog grida(DGV) EditingControlShowing
Try
tb = TryCast(e.Control, TextBox)
If sender.CurrentCell.ColumnIndex = DGV.Columns("kolona").Index Then
If (tb IsNot Nothing) Then RemoveHandler tb.KeyUp, AddressOf BlaBla 'mozes da napravis bilo kakvu funkciju
AddHandler tb.KeyUp, AddressOf BlaBla
Else
RemoveHandler tb.KeyUp, AddressOf BlaBla
End If
Catch
End Try


Drugi i bolju način je da napraviš svoju kontrolu DGV1, a sve što treba je da naslediš:
Inherits System.Windows.Forms.DataGridView
i da dopišeš par linija koda:
<System.Security.Permissions.UIPermission(System.Security.Permissions.SecurityAction.LinkDemand, _
Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean

'Pretvara key kod u key value
Dim key As Keys = keyData And Keys.KeyCode

'hendluje ENTER kao da je TAB
If key = Keys.Enter Then
Return Me.ProcessTabKey(keyData)
End If

Return MyBase.ProcessDialogKey(keyData)

End Function

<System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags:= _
System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean

'hendluje ENTER kao da je TAB
If e.KeyCode = Keys.Enter Then
Return Me.ProcessTabKey(e.KeyData)
End If

Return MyBase.ProcessDataGridViewKey(e)

End Function


Ovo ti super radi jer u mojim projektima ja to koristim već 3 godine.


pozdrav
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 14:20 - pre 172 meseci
Fala momci...

@deerbeer:
Palo mi je to na pamet, ali u projektu vec imam 50-ak gridova koji su vec podeseni (tipa sirine kolona, poravnanja teksta, cell formatting eventi i jos svasta), pa bi mi bio preveliki posao da sve to jovo nanovo.

Ne znam sto bi se desilo da napravim taj custom grid, pa da kroz designer fajlove formi samo promijenim tip postojecih gridova na taj novi, da li bi to automatski proradilo?

Sto se tice expressiona...

Moj dataset, osim nivelacija ima i kalkulacije, otpremnice, fakture, i jos svasta, ovo pomenuto je najglavnije. Po startovanju aplikacije, ja ucitavam podatke iz baze (i zaglavlja i stavke) kroz novi thread, a meni drzim disabled dok mi ga callback ne aktivira, i tada pocinje rad.

Trenutno stanje je oko 50-ak kalkulacija i 500 otpremnica i faktura, koje su, sto se tice expressiona, dosta zahtjevnije od nivelacija.

I mjerio sam, ako ucitavam sve podatke (i zaglavlja i stavke) svih dokumenata (ukljucujuci nivelacije), thread radi 3.5 - 4 sekunde. Ako ucitavam samo zaglavlja, bez stavki, tad thread, naravno, radi svega 0.2 - 0.5 sekundi.

E sad, ako ne ucitavam stavke, kad hocu da otvorim dati dokument, neposredno prije otvaranja pozovem fill. Dakle, opet se expressioni moraju proracunat'. Ali u tom slucaju nema cekanja od 5-6 sekundi (jbg 5-6 sekundi u danasnje vrijeme gigaheraca i gigabajata je ipak vjecnost).

Cekam jedino u slucaju kada radim fill 'naživo', tj. datagridview treba da prikaze upravo te podatke koje se ucitavaju iz baze (a kad nemam expressiona nema ni kasnjenja). Tu je nesto kako ne valja. Ne moze proracun 1000 stavki trajat' 5-6 sekundi vala nikako...

Ali evo, probacu kroz novi thread, a sad mi pade na pamet da mozda podesim datasource svojsvto grida na null, pa posle fill-a da ga vratim na ono sto treba, mozda pomogne...

Pozdrav i hvala.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 15:01 - pre 172 meseci
Citat:

Palo mi je to na pamet, ali u projektu vec imam 50-ak gridova koji su vec podeseni (tipa sirine kolona, poravnanja teksta, cell formatting eventi i jos svasta), pa bi mi bio preveliki posao da sve to jovo nanovo.
Ne znam sto bi se desilo da napravim taj custom grid, pa da kroz designer fajlove formi samo promijenim tip postojecih gridova na taj novi, da li bi to automatski proradilo?

Ne bi trebalo da imas problema, dovoljno je samo u klasi da promenis tip kontrole :
Code:
 
private DataGridView  m_datagird ; 
//u 
private MyDataGridView m_datagrid ; 

Kod nasledjivanja sve postojece kontrole bi ostale iste (formatiranja, sirina i visina ) .

Kod ovih expression-a thread ti nece sigurno nista ubrzati ,
jedino ti UI nece biti blokiran sto je zapravo i glavni cilj thredova ,
mada ako ti je ovo mozda bio pocetni cilj onda je to OK :)

Mozda tu kalkulaciju sa expression-ima probas da odradis kroz UDF u stored proceduri .
Ceo recordset bindujes na grid i sve kalkulacije je uradila stored procedura .
E sad ne znam da li ti ovo pije vodu ...






Viva lollapalooza
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 17:09 - pre 172 meseci
Prvo sam probao sa threadom, namucio se sat vremena i dosao do toga da nista ne ubrzava, plus sto na kraju izvrsavanja ne dobijem rezultate u gridu, nego grid stoji onako prazan, iako su podaci u dataset-u. Tek kad otvorim tu nivelaciju inicirano sa drugog mjesta u aplikaciji, tada se grid napuni podacima.

Onda sam se okrenuo bazi, sto cu. Padalo mi je to na pamet, ali uospte nijesam pristalica toga, nepotrebno povecavam kolicinu podataka koja putuje kroz mrezu. Ali odje je to i vise nego opravdano.

Dakle, proracune sada radi baza, dok sumarne proracune ipak moram rucno i njih radim preko LINQ-a, i totalni response nivelacije je manje od sekunde.

Nijesam zadovoljan elegancijom rjesenja, nekako je na silu, plus i dalje imam mnogo neodgovorenih pitanja, ali sljaka, to je najbitnije :) Nesto tu nije kako treba, ili ja propustam nesto...

Pozdrav.

 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview09.02.2010. u 18:36 - pre 172 meseci
@joksosI

Drugi nacin radi skroz ok, puno hvala, ali prvi nema sanse da proradi.

Posebno mi je cudan onaj momenat gdje odjavljujes handler. Koji handler odjavljujes? On meni, nakon e.handled u KeyDown ponekad prepozna Enter u KeyUp, a ponekad ne.

Ne znam dje grijesim, imas li dje konkretan primjer?

Pozdrav.

 
Odgovor na temu

[es] :: .NET :: Dva pitanja za majstore: ENTER umjesto TAB i spor datagridview

[ Pregleda: 2059 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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