|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
[VB.NET]Indicizzare label o textbox
Ciao, sempre nell'ambito di un calendario di calcio, ho deciso di far si che per ogni incontro si possano far scegliere al massimo 11 giocatori che è possibile selezionare da un datagridview. La problematica sta nel fatto che appena fatta una multiselect di 11 righe, vorrei provare a far scrivere all'interno di 11 label i nomi dei giocatori scelti. Avevo pensato di indicizzare le label con questo codice
Codice:
For i = 1 To 11
Dim c = "Label" & i
Dim t As Label = DirectCast(Me.FindControl(c), Label)
If Not (t Is Nothing) Then
t.Text = "Label " & t.UniqueID
End If
Next
End Sub
Esiste un altro modo per indicizzare label, texbox e etc...? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Mi sembra codice molto contorto per quel che ( a quanto ho capito ) dovrebbe fare. Ma queste 11 Label sono già presenti sulla Form o le vuoi creare dinamicamente ? In che senso le vuoi "indicizzare" ?
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Esistono molti modi per farlo. Ad esempio, i containers di VB.NET sono molto utili per scopi come questo. Prendiamo un GroupBox, inserisco N Label, e scrivo in ognuna, nella proprietà Tag un numero progressivo e univoco ( da 1 a N ). Voglio inserire valori essendo sicuro che l'ordine in cui li passo all'insieme delle Label corrisponda alla posizione delle stesse nell'insieme ? Codice:
Dim valori() As Integer = {1, 2, 3, 4, 5}
For Each L As Control In GroupBox1.Controls
For i As Integer = 0 To valori.Count - 1
If L.Tag = i + 1 Then
L.Text = valori(i)
Exit For
End If
Next
Next
Codice:
Dim valori() As String = {"A", "B", "C", "D", "E"}
Dim tipoLabel As String
Dim indiceLabel As String
For Each L As Control In Me.Controls
If TypeOf L Is Label And L.Tag <> "" Then
tipoLabel = L.Tag.ToString.Split(",")(0)
indiceLabel = L.Tag.ToString.Split(",")(1)
For i As Integer = 0 To valori.Count - 1
If tipoLabel = "giocatore" And indiceLabel = i + 1 Then
L.Text = valori(i)
Exit For
End If
Next
End If
Next
Oltretutto la proprietà Tag di un Control accetta un Object, perciò le possibilità di indicizzazione sono infinite. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
Però, però... c'è un però,come faccio a passare i valori di una multiselezione? Spiego ho un datagrid con 26 giocatori, ne seleziono solo 11(multiselect), vorrei che mi scrivesse uno ad uno i nomi selezionati in ogni label, ci sto provando da stamattina alle sei, ma non riesco a far combaciare gli indici di scorrimento del datagrid e delle label (che tristezza)! Grazie mille! |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Semplice. Se hai scelto di usare la GroupBox è qualcosa di simile a questo ( nel mio caso la DataGridview è "DGV", e il nome Colonna dei giocatori è "Giocatore" ) :
Codice:
Dim giocatori As New List(Of String)
For Each dgvr As DataGridViewRow In DGV.Rows
If dgvr.Selected Then giocatori.Add(dgvr.Cells("Giocatore").Value)
Next
For Each L As Control In GroupBox1.Controls
For i As Integer = 0 To giocatori.Count - 1
If L.Tag = i + 1 Then
L.Text = giocatori(i)
Exit For
End If
Next
Next
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
e come diceva un' altra persona in un altro therad: MARCOGG SANTO SUBITO |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
|
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Quote:
|
||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Questo è il codice:
Codice:
Structure giocatore
Dim cognome As String
Dim nome As String
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If DataGIOC.SelectedRows.Count > 11 Then
MessageBox.Show("Sono stati selezionati più di 11 giocatori, restringere la scelta!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
ElseIf DataGIOC.SelectedRows.Count < 11 Then
MessageBox.Show("Sono stati selezionati meno di 11 giocatori, ampliare la scelta la scelta!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
ElseIf DataGIOC.SelectedRows.Count = 11 Then
Dim gioc As New giocatore
Dim giocatori As New List(Of giocatore)
For Each dgvr As DataGridViewRow In DataGIOC.Rows
If dgvr.Selected Then
gioc.cognome = dgvr.Cells("COGNOME").Value
gioc.nome = dgvr.Cells("NOME").Value
End If
Next
For Each L As Control In GroupBox1.Controls
For i As Integer = 0 To giocatori.Count - 1
If L.Tag = i + 1 Then
L.Text = gioc.cognome & " " & gioc.nome
Exit For
End If
Next
Next
End If
End Sub
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Parecchi errori, purtroppo, a cominciare da quegli "Else If" dopo un Exit Sub, New giocatore al di fuori del ciclo, e infine il riferimento ancora su gioc, mentre dovrebbe essere sull'elemento i-esimo della List...
Faccio prima a riscriverlo che a correggerlo : Codice:
Structure giocatore
Public cognome As String
Public nome As String
End Structure
Codice:
Dim giocatori As New List(Of giocatore)
For Each dgvr As DataGridViewRow In DGV.Rows
If dgvr.Selected Then
Dim G As New giocatore
G.cognome = dgvr.Cells("Cognome").Value
G.nome = dgvr.Cells("Nome").Value
giocatori.Add(G)
End If
Next
For Each L As Control In GroupBox1.Controls
For i As Integer = 0 To giocatori.Count - 1
If L.Tag = i + 1 Then
L.Text = giocatori(i).cognome & " " & giocatori(i).nome
Exit For
End If
Next
Next
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
Mi diresti come fare a colorare di volta in volta una riga a seconda del valore che ha il campo ruolo? |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
For Each dgvr As DataGridViewRow In DGV.Rows
Select Case dgvr.Cells("Ruolo").Value
Case "Portiere"
dgvr.DefaultCellStyle.BackColor = Color.Tan
Case "Difensore"
dgvr.DefaultCellStyle.BackColor = Color.Lime
Case "Attaccante"
dgvr.DefaultCellStyle.BackColor = Color.Yellow
'...
Case Else
'...
End Select
Next
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
Mi servirebbe sapere unulteriore cosa, come faccio a prelevare i valori dalle label all'interno ella groupbox? e per colorarli invece all'interno della group a seconda del ruolo? ho pensato di fare riferimento alla tag e conseguentemente al .text dell'oggeto di riferimento della tag, ma non so come scriverlo (sempre se ho pensato bene)! Ultima modifica di Fabio7586 : 17-11-2009 alle 12:08. |
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Quote:
Tag = indice,ruolo A questo punto però dovrai anche modificare il codice che abbiamo visto al post #7. Il Tag lo setti in fase di estrazione dei dati dalla DataGridView, e poi con la solita Select Case decidi che colore debba avere la Label a seconda del ruolo... |
||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Quote:
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Semplice.
Basta modificare il Tag in ogni Label nella GroupBox. Tag di default = 1,ruolo A questo punto : Codice:
Structure giocatore
Public cognome As String
Public nome As String
Public ruolo As String
End Structure
Codice:
Dim giocatori As New List(Of giocatore)
For Each dgvr As DataGridViewRow In DGV.Rows
If dgvr.Selected Then
Dim G As New giocatore
G.cognome = dgvr.Cells("Cognome").Value
G.nome = dgvr.Cells("Nome").Value
G.ruolo = dgvr.Cells("Ruolo").Value
giocatori.Add(G)
End If
Next
Dim indice As Integer = 0
For Each L As Control In GroupBox1.Controls
For i As Integer = 0 To giocatori.Count - 1
indice = L.Tag.ToString.Split(",")(0)
If indice = i + 1 Then
L.Text = giocatori(i).cognome & " " & giocatori(i).nome
L.Tag = indice & "," & giocatori(i).ruolo
Exit For
End If
Next
Next
Dim ruolo As String
For Each L As Control In GroupBox1.Controls
ruolo = L.Tag.ToString.Split(",")(1)
Select Case ruolo
Case "Portiere"
L.BackColor = Color.Tan
Case "Difensore"
L.BackColor = Color.Lime
Case "Attaccante"
L.BackColor = Color.Yellow
'...
Case Else
L.BackColor = Color.White
End Select
Next
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2007
Città: Napoli
Messaggi: 392
|
Grazie per tutto l'aiuto che mi dai!
Avendo ora messo una doppia tag (indice, ruolo), come faccio a riconoscere univocamente la posizione della label all'interno della groupbox? avevo provato a scrivere Codice:
For Each L As Control In GroupBox1.Controls if l.tag=1 then .... ... end if NEXT Ultima modifica di Fabio7586 : 18-11-2009 alle 10:30. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
If L.Tag.ToString.Split(",")(0) Then
'...
End If
- Mettiamo di avere una GroupBox vuota, senza alcuna Label, e di aggiungere dinamicamente le Label, una volta completata la selezione sul DGV. > Mi creo una classe che eredita da Label, per semplificarmi le cose : Codice:
Public Class LblG
Inherits Label
Private m_indice As Integer
Private m_ruolo As String
Public Property indice() As Integer
Get
Return m_indice
End Get
Set(ByVal value As Integer)
m_indice = value
End Set
End Property
Public Property ruolo() As String
Get
Return m_ruolo
End Get
Set(ByVal value As String)
m_ruolo = value
Select Case m_ruolo
Case "Portiere"
Me.BackColor = Color.Tan
Case "Difensore"
Me.BackColor = Color.Lime
Case "Attaccante"
Me.BackColor = Color.Yellow
'...
Case Else
Me.BackColor = Color.White
End Select
End Set
End Property
Public Sub New(ByVal indice As Integer)
Me.indice = indice
Me.AutoSize = False
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
Me.Font = New Font("Arial", 12, FontStyle.Regular)
Me.TextAlign = ContentAlignment.MiddleLeft
Me.Height = 20
Me.Width = 300
Me.Left = 10
Me.Top = (m_indice - 1) * (Me.Height + 10) + 20
End Sub
End Class
Codice:
GroupBox1.Controls.Clear()
Dim cnt As Integer = 0
For Each dgvr As DataGridViewRow In DGV.Rows
If dgvr.Selected Then
cnt += 1
Dim LG As New LblG(cnt)
LG.Text = dgvr.Cells("Cognome").Value & " " & dgvr.Cells("Nome").Value
LG.ruolo = dgvr.Cells("Ruolo").Value
GroupBox1.Controls.Add(LG)
End If
Next
Codice:
For Each LG As LblG In GroupBox1.Controls
If LG.indice = 3 Then MsgBox(LG.Text & " - " & LG.ruolo)
Next
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:13.




















