[ kopca @ 09.12.2004. 09:56 ] @
Dobro vise nema smisla sa ovim datagridom se patim nenormalno. Imam grid koji se update-uje sa event handlerom grdOpstine_CurrentCellChanged. Datagrid grdOpstine radi lepo, ali kad se korisnik pozicionira na prvu celiju dela za unosenje novog reda, unese vrednost i lupi Enter, kursor skoci u sledeci red za dodavanje. Ako je u prethodnom redu za dodavanje bilo nekih null vrednosti za polja koja ne dozvoljavaju null, sqlException se pravi.


Private Sub grdOpstine_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles grdOpstine.CurrentCellChanged
Try
adptOpstine.Update(dsOpstine)
Catch ex As System.Data.SqlClient.SqlException
MsgBox("grdOpstine_CurrentCellChanged()" & vbCrLf & ex.Message,MsgBoxStyle.Exclamation, "Exception")
End Try
End Sub

Probao sam da regulisem keydown datagrida, ali on ne reaguje. Izgleda da se dogadjaji sa tastature na gridu handle-uju automatski. Kako da regulisem to na, recimo, sl. nacin? Korisnik dok lupa Enter pomera se po tekucem redu i tek na zadnjoj celiji skoci na sledeci red? Znaci u grdOpstine_keydown moram da se pitam da li je trenutna celija poslednja, ako jeste skoci u novi red, ako nije skoci u susednu celiju.

Glavno sta zelim da izbegnem je explicitni update koji korisnik pokrece nekim dugmetom... Kako da postignem da kako korisnik kuca u gridu, tako da update-uje bazu, ako ne sa currentcellchanged eventom?

Private Sub grdOpstine_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles grdOpstine.KeyDown
MsgBox(e.KeyCode)
End Sub
[ akrosoft @ 09.12.2004. 12:07 ] @
Probaj da uradis validaciju unesenih podataka pre update-a. Ili, ako ti je grid vezan za DataTable, onda mozes da koristis dogadjaje DataTable-a (ColumnChanging, ColumnChanged, RowChanging, RowChanged) i da radis validaciju pre nego azuriras podatke u currentCellChanged eventu.

Sto se tice izmene shortucut keys-a za grid, nisam siguran da li postoji neka opcija na samom gridu da se to promeni, ali uvek se mozes sa overridovanjem ProcessKeyPreview-a da ih kontrolises.
Znaci, overridujes ProcessKeyPreview, hvatas KeyDown messages, keyCode = Keys.Enter, proveravas i druge uslove (aktivna kontrola, poslednja celija u gridu itd), i radis SendKeys.Send("{Tab}"), i return true, a u svakom drugom slucaju zoves baznu implementaciju ProcessKeyPreview-a da odradi ono sto bi uradio po defaultu.
[ mmix @ 09.12.2004. 13:18 ] @
Imas i alternativu da u samom SQLu resis ovo, ako se adptOpstine oslanja na stored procedure, izmeni insert i update SP, tako da ako adapter posalje null, stored procedura ubaci neku default vrednost:
npr

insert into tabela (nonnullpolje) values (IsNull(@Parametar, ''))


[ kopca @ 09.12.2004. 14:28 ] @
Evo resenja...

Public Class DataGridKeyEvents
Inherits System.windows.Forms.DataGrid
'Private Const WM_KEYDOWN = &H100
'Private Const WM_KEYUP = &H101

Protected Overrides Function ProcessCmdKey(ByRef msg _
As System.Windows.Forms.Message, ByVal keyData As _
System.Windows.Forms.Keys) As Boolean

If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
Me.Parent.PreProcessMessage(msg)
'Ovde ide kod za korisnicki 'Enter'
SendKeys.Send("{Tab}")
Return True
Else
Return MyBase.ProcessCmdKey(msg, keyData)
End If
End Function 'ProcessCmdKey

End Class

HVALA LJUDI...SENDKEYS MI JE TREBALO...
[ Untouchabble @ 07.04.2006. 14:27 ] @
I šta se dalje radi? Kako da implementiram ovo u program, treba li da koristim neki event handler ili šta?
[ Untouchabble @ 09.04.2006. 13:21 ] @
Provalio sam, jednostavno promeniš svuda gde se pojavljuje DataGrid sa DataGridKeyEvents. Čisto radi drugih amatera, da se ne cimaju.