View Full Version : Visual studio - problema datagridview
mistermix73
13-09-2014, 14:24
Ciao, ho creato un software usando windows form di visual studio ma ho un problema con la datagridview, in pratica ho creato un button che invia l'ora attuale alla cella della riga selezionata in quel momento in una datagridview il problema e che dovrebbe farlo solo per una volta mentre invece ogni volta che viene cliccato il button mi aggiorna l'ora, qualcuno sa dirmi come evitare di sovrascrivere una cella?
Postare il codice potrebbe aiutare a individuare il tuo problema.
Ad occhio, quello che devi fare è tenere traccia in una variabile del fatto che hai eseguito l'operazione la prima volta, così puoi evitare di ripeterla ai click successivi.
L'approccio ideale è quello di definire un tuo command (qui trovi un esempio (http://blogs.msdn.com/b/mikehillberg/archive/2009/03/20/icommand-is-like-a-chocolate-cake.aspx)) e poi fare un binding con il click del bottone.
In questo modo separi chiaramente la componente grafica del bottone e la logica associata alla sua pressione.
birmarco
14-09-2014, 15:41
private class TuaPagina
{
private TuaPagina()
{
btnGrid.Click =+ btnGrid_Click;
}
private void btnGrid_Click(object sender, EventArgs e)
{
//Inserisci data nella grid
btnGrid.Click =- btnGrid_Click;
}
}
Questa è una possibilità che ti evita di usare un boolean. Dopo aver inserito la data rimuovi l'handler del click.
Poi dipende se questo bottone ti serve anche per fare altro oppure no ;)
Sicuramente se dopo il click non de-registri l'handler che inserisce l'ora, ogni volta che clicchi il bottone il codice verrà sempre eseguito.
Può essere anche meglio il suggerimento di msangi se stai creando un software con MVVM, in questo caso nel CanExecute dell'ICommand fai il check della data (è già inserita o no?)
mistermix73
15-09-2014, 10:13
Grazie delle risposte ragazzi il button non posso disabilitarlo poichè serve per inserire gli altri record in datagridview, in pratica è un programma di gestione garage e funziona cosi: una datagridview popolata tramite due button, il button1 mi permette di inserire targa, tariffa ed ora di entrata e il button2 mi inserisce l'ora di uscita e l'importo da pagare nella riga selezionata, per questo mi serve che il button2 mi inserisca l'ora di uscita solo una volta per ogni riga altrimenti si rischia che l'utente seleziona la riga sbagliata e gli modifica una seconda volta l'orario di conseguenza l'importo da pagare e gli eventuali totali di giornata (che tra l'altro ancora non ho creato :D ) questo è il metodo che ho usato io:
nel pubblic class form2
Private ind As Integer
mentre nell'evento button2_click
DataGridView1.Rows(ind).SetValues(Me.DataGridView1.Item(0, ind).Value.ToString, Me.DataGridView1.Item(1, ind).Value.ToString, Me.DataGridView1.Item(2, ind).Value.ToString, Me.DataGridView1.Item(3, ind).Value.ToString, TextBox2.Text)
birmarco
16-09-2014, 23:15
Quella riga riga di codice viola almeno 5 codici di diritto penale! :asd:
E' troppo lunga da leggere :D
Cmq se il button può settare solo una volta la cella devi in qualche modo tenere traccia di ciò.
Soluzione 1:
Nel caso la cella può essere riempita una sola volta (quindi prima era vuota):
If (String.IsNullOrWhiteSpace(Grid.SelectedItem.Value) Than
//Aggiungi data
End If
Soluzione 2:
Nel caso la cella possa avere anche altri valori prima della tua azione, devi tenere traccia degli inserimenti. Dato che è una sola colonna/riga può andare bene un array, altrimenti devi usare una matrice:
//Nel corpo della classe
Private col As New List(Of Integer)
//Ogni volta che inserisci una nuova riga
col.Add(0);
//Al click del bottone, controlli che la posizione nella lista non sia già settata, in caso sia 0 imposti la data, altrimenti lasci stare. L'1 nella lista sta ad indicare che hai già settato quella data.
If (Grid.SelectedItem.ColIndex < col.Count) Than
If (Col[RawIndex] == 0) Than
Col[RawIndex] = 1
//Setto la data
EndIf
End If
PS. Non uso VB da un sacco, potrei aver fatto errori di sintassi :D
PPS. Grid è la tua GridDataView, SelectedItem ipotizzo sia l'elemento selezionato (cella), Value e RawIndex il valore della cella e il suo indice di riga... sono anni che non uso Windows Form, non ricordo più come sia la GridDataView :Prrr:
mistermix73
17-09-2014, 12:11
Sto provando le due possibilità ovviamente adattandole al mio caso ma (causa la mia ignoranza/inesperienza) mi da sempre errore in tutti e due casi. Nel primo caso:
If (String.IsNullOrWhiteSpace(Datagridview1.SelectedItem.Value) Then
//va avanti con il codice
End If
nel secondo caso:
If (Datagridview1.SelectedItem.ColIndex < col.Count) Then
If (Col[RawIndex] == 0) Then
Col[RawIndex] = 1
//va avanti con il codice
EndIf
End If
ho provato diverse soluzioni ma niente....
birmarco
17-09-2014, 15:51
Sto provando le due possibilità ovviamente adattandole al mio caso ma (causa la mia ignoranza/inesperienza) mi da sempre errore in tutti e due casi. Nel primo caso:
If (String.IsNullOrWhiteSpace(Datagridview1.SelectedItem.Value) Then
//va avanti con il codice
End If
nel secondo caso:
If (Datagridview1.SelectedItem.ColIndex < col.Count) Then
If (Col[RawIndex] == 0) Then
Col[RawIndex] = 1
//va avanti con il codice
EndIf
End If
ho provato diverse soluzioni ma niente....
Come avevo scritto nel PS sono proprietà inventate da me per farti capire il concetto, non ricordando quelle di default della DataGridView :)
Con SelectedItem intendo la proprietà che definisce la cella selezionata, non so se c'è, ma sicuramente puoi riferirti facilmente ad essa guardando la doc su MSDN :)
Stessa cosa per SelectedItem.Value indica il contenuto della cella che hai selezionato, anche qui devi cercare la proprietà giusta.
Nel tuo codice usi "DataGridView1.Item(0, ind).Value", quindi puoi intendere il mio codice come DataGridView1.Item(IndiceColonnaSelezionata, IndiceRigaSelezionata).Value
RawIndex indica l'indice della riga selezionata dall'utente, anche in questo caso devi cercare tu la proprietà relativa all'indice della riga selezionata.
;)
mistermix73
20-09-2014, 12:26
If String.IsNullOrWhiteSpace(DataGridView1.Item(4, ind).Value) Then
fatto grazie mille!!
mistermix73
20-09-2014, 12:35
Per caso sai dirmi anche se c'e' modo di far comparire sempre un formato numerico a due cifre in un label? al momento fermando il cronometro prima del 10 mi compare una sola cifra per esempio 9 ma a me serve il formato 09
Dai un'occhiata qui per vedere come puoi impostare la formattazione in una label http://stackoverflow.com/a/18362876/353268
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.