![]() |
Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
DataGridCheckBoxColumn help
Last Updated: Aug 06 2014 14:32, Started by
kunz
, Aug 01 2014 12:15
·
0

#1
Posted 01 August 2014 - 12:15

Intr-un form am 3 datagridview-uri care imi afiseaza niste informatii din baza de date. Prima coloana la aceste datagridview-uri este de forma DataGridCheckBoxColumn.Am codul de mai jos la fiecare datagridview :
Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick If DataGridView1.Rows(e.RowIndex).Cells(0).Value = False Then DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Else DataGridView1.Rows(e.RowIndex).Cells(0).Value = False End If End Sub As vrea ca in momentul in care mai am o inregistrare selectata in datagridview1 aceasta sa se deselecteze si sa imi ramana selectata doar cea care am selectat-o ultima oara. Am codul urmator : Private Sub DataGridView1_RowLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowLeave If DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Then DataGridView1.Rows(e.RowIndex).Cells(0).Value = False End If End Sub Totul ar fi OK daca as avea doar un datagridview dar problema este ca in momentul cand vreau sa selectez o inregistrare din datagridview2 imi deselecteaza ce am ales eu in datagridview1 sau in datagridview3. Nu reusesc sa gasesc o solutie.Puteti sa ma ajutati cu niste idei ? Multumesc. |
#3
Posted 01 August 2014 - 12:51

Selectia nu se memoreaza nicaieri.Doar ma intereseaza cum as putea ca in momentul in care selecteaz ceva din alt datagridview sa imi ramana si selectie facuta in datagriview-ul anterior.
Mentionez ca nu pot sa fac mai mult de o selectie in fiecare datagridview.Deci in momentul in care am un rand selectat in datagridview1 si fac alta selectie in acelasi datagridview1 randul selectat anterior se debifeaza. Edited by kunz, 01 August 2014 - 12:52. |
#4
Posted 01 August 2014 - 13:12

Pai codul pus in Leave te incurca, iti da in cap, la o selectie facuta o anuleaza.
Tu pastreaza randul bifat undeva iar la urmatoarea bifare stii rapid pe cine sa debifezi ramanand astfel doar linia curenta bifata. Edited by neagu_laurentiu, 01 August 2014 - 13:26. |
#5
Posted 01 August 2014 - 23:26

Adica intr-un textbox sa inserez numarul randului bifat nu?
Poti sa imi dai un exemplu sau sa adaptezi codul postat ca nu reusesc sa imi dau seama. |
#6
Posted 03 August 2014 - 16:52

sau pune fiecare datagridview containere separate (Frame)
asa cum ai avea mai multe Radio butoane ce nu vrei sa interactioneze intre ele. |
#7
Posted 06 August 2014 - 09:36

Multumesc pentru sfaturi. Pana la urma am gasit urmatoarea solutie.
Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick If DataGridView1.Rows(e.RowIndex).Cells(0).Value = False Then For Each row As DataGridViewRow In Me.DataGridView1.Rows row.Cells(0).Value = False Next DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Else DataGridView1.Rows(e.RowIndex).Cells(0).Value = False End If End Sub |
#8
Posted 06 August 2014 - 10:25

kunz, on 06 august 2014 - 09:36, said:
For Each row As DataGridViewRow Edited by neagu_laurentiu, 06 August 2014 - 10:26. |
#9
Posted 06 August 2014 - 12:45

neagu_laurentiu, on 01 august 2014 - 13:12, said:
Pai codul pus in Leave te incurca, iti da in cap, la o selectie facuta o anuleaza. Tu pastreaza randul bifat undeva iar la urmatoarea bifare stii rapid pe cine sa debifezi ramanand astfel doar linia curenta bifata. Am incercat sa pastrez randul bifat intr-un textbox.(dgv2) Private Sub DataGridView2_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellClick On Error Resume Next If DataGridView2.Rows(e.RowIndex).Cells(0).Value = False then DataGridView2.Rows(e.RowIndex).Cells(0).Value = True DataGridView2.Rows(Me.dgv2.Text).Cells(0).Value = False Else DataGridView2.Rows(e.RowIndex).Cells(0).Value = False End If Me.dgv2.Text = DataGridView2.CurrentRow.Index End Sub Totul merge ok la codul de mai sus pana cand incerc sa bifez inca o data randul debifat si nu se mai intampla nimica.(ramane nebifat in continuare) neagu_laurentiu, on 06 august 2014 - 10:25, said:
E buna pentru inceput. Da' ia stai stramb si judeca drept: de ce sa tot freci liniile alea ca un muncitor cu basca in loc sa pastrezi intr-o variabila randul bifat ca la urmatoarea bifare sa debifezi direct pe cel anterior (variabila iti spune care, fara sa faci lucru manual) si nu-l mai stresezi pe procesor inutil. Poti sa imi spui ce nu merge la codul de mai sus. Daca varianta aleasa de mine nu e cea mai corecta te rog sa imi dai un exemplu despre cum ar trebui sa arate codul. |
#10
Posted 06 August 2014 - 13:41

kunz, on 06 august 2014 - 12:45, said:
Am incercat sa pastrez randul bifat intr-un textbox. Edited by neagu_laurentiu, 06 August 2014 - 13:44. |
#11
Posted 06 August 2014 - 14:32

Informatia nu trebuie tinuta neaparat in ceva vizual (TextBox).
Abordarea aleasa e prea explicita si te vei pierde in cod pe masura ce mai adaugi noi functionalitati. Mult mai usor e sa folosesti DataBinding Pasul 1 - Creezi o clasa ce va tine informatii despre randurile in cauza In acest exemplu am ales sa definesc clasa Elev ce are nume, prenume si poate fi acceptat. Public Class Elev Implements INotifyPropertyChanged Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged Private Sub NotifyPropertyChanged(propertyName As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) End Sub Private _acceptat As Boolean Private _nume As String Private _prenume As String Public Property Acceptat As Boolean Get Return _acceptat End Get Set(value As Boolean) If value <> _acceptat Then _acceptat = value NotifyPropertyChanged("Acceptat") End If End Set End Property Public Property Nume As String Get Return _nume End Get Set(value As String) If value <> _nume Then _nume = value NotifyPropertyChanged("Nume") End If End Set End Property Public Property Prenume As String Get Return _prenume End Get Set(value As String) If value <> _prenume Then _prenume = value NotifyPropertyChanged("Prenume") End If End Set End Property End Class Fata de o clasa obisnuita, aceasta permite o mecanism de abonare pentru a fi notificat daca se modifica vreun camp al elevului Pasul 2 - Se defineste o lista de elevi ce vor fi afisati Aceasta lista provine deobicei dintr-o baza de date, dar aici o definesc static Dim listaElevi As New BindingList(Of Elev) From { New Elev With {.Acceptat = False, .Nume = "Ionescu", .Prenume = "Ion"}, New Elev With {.Acceptat = True, .Nume = "Ionescu", .Prenume = "Gheorghe"}, New Elev With {.Acceptat = False, .Nume = "Popescu", .Prenume = "Alin"} } Pasul 3 - Ma abonez la toti elevii pentru a fi notificat daca se modifica ceva Deasemenea retin si elevul actual acceptat (daca e vreunul acceptat) intr-un camp privat elevAcceptat. For Each elev As Elev In listaElevi 'ne abonam pentru a fi anunti de vreo schimbare in randul elevilor AddHandler elev.PropertyChanged, AddressOf ElevAFostModificat 'memoram elevul acceptat acum If elev.Acceptat Then elevAcceptat = elev End If Next Pasul 4 - Predau lista grid-ului Gridul va folosi lista creata. DataGridView1.DataSource = listaElevi Aceasta e singura linie de cod legata de grid. El va stii automat cum sa afiseze fiecare elev si se va abona si el pentru a afisa orice schimbare. Pasul 5 - Urmaresc modificarile Definesc o functie ce e executata atunci cand se modifica oricare elev. Daca a fost modificat campul Acceptat, atunci deselectez predecentul elev acceptat. Private Sub ElevAFostModificat(sender As Object, e As PropertyChangedEventArgs) 'elevul ce a fost modificat e transmis prin sender Dim elev = CType(sender, Elev) If e.PropertyName = "Acceptat" Then 's-a modificat campul Acceptat If elev.Acceptat Then 'noul elev e acum acceptat If Not elevAcceptat Is Nothing Then 'alt elev a fost acceptat inainte, acum nu va mai fi elevAcceptat.Acceptat = False End If 'noul elev e cel acceptat elevAcceptat = elev Else 'elevul nu mai e acceptat elevAcceptat = Nothing End If End If End Sub
Spoiler
|
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users