Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Info Coronavirus/Vaccinare vs Fake News

Hackintosh Ryzen 5600g fara placa...

Cum izolez acest fir?

rtorrent - scripting
 TV LG 49UB850V-ZD, musculita in e...

Montare clapeta antiretur la hota

laptop nou + licenta windows

Unbelievable - De Necrezut -2019 ...
 Recomandare achizitie instant ap...

Cand iau pensia pensionarii a car...

Verificare gaze

Liza electrica cu catarg sau stiv...
 Tazz & Kaufland

Router wireless ZTE ZXHN H3601, D...

Amplificator pentru boxe Z906

TVA 5 sau 19%
 

DataGridCheckBoxColumn help

- - - - -
  • Please log in to reply
10 replies to this topic

#1
kunz

kunz

    Junior Member

  • Grup: Members
  • Posts: 64
  • Înscris: 12.09.2011
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 Su
b

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.

#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 28,238
  • Înscris: 10.08.2005
Si unde ai memorat tu ultima inregiatrare selectata?

#3
kunz

kunz

    Junior Member

  • Grup: Members
  • Posts: 64
  • Înscris: 12.09.2011
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,840
  • Înscris: 30.07.2003
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
kunz

kunz

    Junior Member

  • Grup: Members
  • Posts: 64
  • Înscris: 12.09.2011
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
nexusm

nexusm

    Senior Member

  • Grup: Senior Members
  • Posts: 2,793
  • Înscris: 07.07.2011
sau pune fiecare datagridview containere separate (Frame)
asa cum ai avea mai multe Radio butoane ce nu vrei sa interactioneze intre ele.

#7
kunz

kunz

    Junior Member

  • Grup: Members
  • Posts: 64
  • Înscris: 12.09.2011
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,840
  • Înscris: 30.07.2003

View Postkunz, on 06 august 2014 - 09:36, said:

For Each row As DataGridViewRow
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.

Edited by neagu_laurentiu, 06 August 2014 - 10:26.


#9
kunz

kunz

    Junior Member

  • Grup: Members
  • Posts: 64
  • Înscris: 12.09.2011

View Postneagu_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)


View Postneagu_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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,840
  • Înscris: 30.07.2003

View Postkunz, on 06 august 2014 - 12:45, said:

Am incercat sa pastrez randul bifat intr-un textbox.
Pai nu cred ca trebuie sa vada cineva acea valoare ! De asta o variabila e mult mai buna. Dar fie si asa, Me.dgv2.Text nu pastreaza valori numerice. Pe urma tu ai ceva date la inceput in gridul ala ? Ai debuggerul la dispozitie, pune un breakpoint la metoda in cauza, mergi pas cu pas prin cod, analizeaza fiecare moment, inspecteaza variabilele si tot fluxul. Asa inveti, cand tu transpiri, eu doar iti arat o directie.

Edited by neagu_laurentiu, 06 August 2014 - 13:44.


#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,256
  • Înscris: 24.02.2007
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

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate