DataGridView spostarsi tra le righe

domenica 01 maggio 2016 - 21.22
Tag Elenco Tags  VB.NET

pedro8a Profilo | Junior Member

Ciao a tutti,
sto cercando di spostarmi tra le righe di un DataGridView da tastiera il tutto rimanendo con il focus su una texbox.
Dalla texbox nell'evento KeyDown ho messo:
Select Case e.KeyCode
Case Keys.Up
'....
Case Keys.Down
'...
End Select

Fin qui tutto ok.
Ora però non riesco a spostarmi correttamente tra le Rows.

Qualche consiglio?

________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

Adesso vado a reminiscenza, ma per spostare lo stato attivo della datagridview dovresti impostare la selected sulla riga e quindi

DataGridView1.Rows[3].Selected = true; (ad esempio per impostare la riga 3 come selezionata)

pedro8a Profilo | Junior Member

Ciao ysdemarc,
ok, con .select riesco a spostare lo stato attivo sulla riga successiva/precedente.
Questo quando premo freccia sù/giù

Ora però voglio finiere, quindi:
- quando premo pagina giù/sù?
- quando mi sposto sulla riga successiva all'ultima visibile, la barra di scorrimento del datagrid non si sposta, come la sposto?

Grazie

________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

Vedi quante sono le righe visibili e sommi o sottrai il numero di righe desiderato quando fai pag su o pag giu.

pedro8a Profilo | Junior Member

>Vedi quante sono le righe visibili e sommi o sottrai il numero
>di righe desiderato quando fai pag su o pag giu.
>
>
Perfetto grazie, oggi provo.
Però quando faccio freccia giù diventano blu le righe visibili.
Dopo l'ultima riga visibile, quando faccio freccia giù, la visualizzazione del datagrid non si aggiorna.
Vedo sempre le stesse righe, ma il codice sta funzionando, scorre correttamente le righe.
Spero di essere stato chiaro

________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

allora se Selected seleziona sta di fatto che quando cabi riga devi deselezionare la precedente mettendo Selected = false

a meno che non abbia impostato la proprietà MultiSelect su false e quindi te la deseleziona in automatico appena ne selezioni una nuova di riga.

pedro8a Profilo | Junior Member

>allora se Selected seleziona sta di fatto che quando cabi riga
>devi deselezionare la precedente mettendo Selected = false
>
>a meno che non abbia impostato la proprietà MultiSelect su false
>e quindi te la deseleziona in automatico appena ne selezioni
>una nuova di riga.

Ho messo .Selected = False
E funziona correttamente, seleziona la riga di arrivo e deseleziona la riga di partenza, fin qui ok.
Però quando finiscono le righe visibili sul datagrid, ad esempio 10 righe, la riga 11 viene selezionata, così come la 12, 13, nn.
Però non vedo le righe, il datagrid è fermo non scorre

________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

fai un cambio..

utilizza semplicemente

dataGridView1.Rows[iRow].Cells[0].Selected = true;

se poi vuoi anche visualizzare selezionata l'intera riga successivamente metti anche dataGridView1.Rows[iRow].Selected = true;

Quando selezioni la cella il "cursore" si sposta con essa cosa che non accade selezionando la riga.

pedro8a Profilo | Junior Member

>fai un cambio..
>
>utilizza semplicemente
>
>dataGridView1.Rows[iRow].Cells[0].Selected = true;
>
>se poi vuoi anche visualizzare selezionata l'intera riga successivamente
>metti anche dataGridView1.Rows[iRow].Selected = true;
>
>Quando selezioni la cella il "cursore" si sposta con essa cosa
>che non accade selezionando la riga.

Niente da fare, il datagrid non scorre.
Le righe vengono evidenziate correttamente però
Il mio codice nell'evento txtCercaCliente_KeyDown:

dgvAnagrafiche.Rows(_currentRow).Selected = False
_currentRow -= 1
dgvAnagrafiche.Rows(_currentRow).Selected = True
dgvAnagrafiche.Rows(_currentRow).Cells(1).Selected = True



________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

non è possibile..io ho provato è va bene..

ecco il codice che ho provato:

private void textBox1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Up: if (iRow > 0) { //dataGridView1.Rows[iRow].Selected = false; iRow--; //dataGridView1.Rows[iRow].Selected = true; dataGridView1.Rows[iRow].Cells[0].Selected = true; } break; case Keys.Down: if (iRow < dataGridView1.RowCount) { //dataGridView1.Rows[iRow].Selected = false; iRow++; //dataGridView1.Rows[iRow].Selected = true; dataGridView1.Rows[iRow].Cells[0].Selected = true; } break; } }

da premettere che ho impostato:

dataGridView1.MultiSelect = false;

ed ho dichiarato a livello di modulo

private int iRow = 0;

pedro8a Profilo | Junior Member

>non è possibile..io ho provato è va bene..
>
>ecco il codice che ho provato:
>
>private void textBox1_KeyDown(object sender, KeyEventArgs e)
> {
>
>
> switch (e.KeyCode)
> {
> case Keys.Up:
> if (iRow > 0)
> {
>//dataGridView1.Rows[iRow].Selected = false;
> iRow--;
>//dataGridView1.Rows[iRow].Selected = true;
>dataGridView1.Rows[iRow].Cells[0].Selected = true;
> }
> break;
> case Keys.Down:
> if (iRow < dataGridView1.RowCount)
> {
>//dataGridView1.Rows[iRow].Selected = false;
> iRow++;
>//dataGridView1.Rows[iRow].Selected = true;
>dataGridView1.Rows[iRow].Cells[0].Selected = true;
> }
> break;
>
> }
> }
>
>da premettere che ho impostato:
>
>dataGridView1.MultiSelect = false;
>
>ed ho dichiarato a livello di modulo
>
>private int iRow = 0;

Il mio codice è vb, ma mi sembra praticamente identico:
Try
Dim totRows As Integer = dgvAnagrafiche.Rows.Count

Select Case e.KeyCode
Case Keys.Up
If _currentRow = 0 Then
Exit Sub
End If
If _currentRow > 0 Then
dgvAnagrafiche.Rows(_currentRow).Selected = False

_currentRow -= 1
dgvAnagrafiche.Rows(_currentRow).Selected = True
dgvAnagrafiche.Rows(_currentRow).Cells(1).Selected = True

End If
Case Keys.Down
If _currentRow = totRows - 1 Then
Exit Sub
End If
dgvAnagrafiche.Rows(_currentRow).Selected = False

_currentRow += 1
dgvAnagrafiche.Rows(_currentRow).Selected = True
dgvAnagrafiche.Rows(_currentRow).Cells(1).Selected = True

End Select
IDAnagrafica = dgvAnagrafiche.Rows(_currentRow).Cells("IDAnagrafica").Value
Catch ex As Exception
'Err..

End Try

Niente da fare la barra laterale del datagrid, ovviamnete quando lavoro sulla textbox, non scorre
'Fatto
dataGridView1.MultiSelect = false


________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

Ho riprovato.. quello che ti ho postato è corretto

Quello che scrivi tu sembrerebbe essere la stessa cosa (a parte i salti incondizionali)

Non è ca da qualche altra parte fai qualcos'altro che vanifica quello scritto la selezione della riga io l'avevo commentata perchè inutile come si trova ora

infatti in questo modo selezioni la riga e poi la cella è come selezionare solo la cella.

prova col debug cosa succede, magari da qualche altra parte cambi il valore del tuo indice riga.

pedro8a Profilo | Junior Member

>Ho riprovato.. quello che ti ho postato è corretto
>
>Quello che scrivi tu sembrerebbe essere la stessa cosa (a parte
>i salti incondizionali)
>
>Non è ca da qualche altra parte fai qualcos'altro che vanifica
>quello scritto la selezione della riga io l'avevo commentata
>perchè inutile come si trova ora
>
>infatti in questo modo selezioni la riga e poi la cella è come
>selezionare solo la cella.
>
>prova col debug cosa succede, magari da qualche altra parte cambi
>il valore del tuo indice riga.

L'unica cosa che faccio è
_currentRow = dgvAnagrafiche.CurrentRow.Index

nell'evento
CurrentCellChanged del DGV, perchè se ti sposti con il mouse e poi torni sulla textbx devi sapere su quale riga sei


________________________
Pedro8a
Sviluppo per passione

pedro8a Profilo | Junior Member

>Ho riprovato.. quello che ti ho postato è corretto
>
>Quello che scrivi tu sembrerebbe essere la stessa cosa (a parte
>i salti incondizionali)
>
>Non è ca da qualche altra parte fai qualcos'altro che vanifica
>quello scritto la selezione della riga io l'avevo commentata
>perchè inutile come si trova ora
>
>infatti in questo modo selezioni la riga e poi la cella è come
>selezionare solo la cella.
>
>prova col debug cosa succede, magari da qualche altra parte cambi
>il valore del tuo indice riga.

Niente da fare non va, hai qualche idea??

Grazie ancora


________________________
Pedro8a
Sviluppo per passione

ysdemarc Profilo | Expert

Qualche idea non c'è l'ho perchè a me funziona tranquillamente.

posso solo postarti tutto il codice in c# che ho scritto per prova.

è il codice di un form FrmProva che ha in se solo 2 controlli
un datagridview con 2 colonne ed una text box.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace UtilitaVarie { public partial class FrmProva : Form { public FrmProva() { InitializeComponent(); carica(); } /// <summary> /// Carica dati di prova /// </summary> private void carica() { for (int i = 65; i <= 90; i++) dataGridView1.Rows.Add(); for (int i = 65; i <= 90; i++) { dataGridView1.Rows[i - 65].Cells[0].Value = (char)i; dataGridView1.Rows[i - 65].Cells[1].Value = (char)i + i.ToString(); Application.DoEvents(); } } private void textBox1_KeyDown(object sender, KeyEventArgs e) { int iRow = dataGridView1.CurrentRow.Index; int prevIRow = iRow; switch (e.KeyCode) { case Keys.Up: if (iRow > 0) iRow--; break; case Keys.Down: if (iRow < dataGridView1.RowCount) iRow++; break; case Keys.PageUp: iRow -= dataGridView1.DisplayedRowCount(false); if (iRow < 0) iRow = 0; break; case Keys.PageDown: iRow += dataGridView1.DisplayedRowCount(false); if (iRow > dataGridView1.RowCount - 2) iRow = dataGridView1.RowCount - 2; break; } if (prevIRow != iRow) { dataGridView1.Rows[iRow].Cells[1].Selected = true; dataGridView1.Rows[iRow].Selected = true; } } private void FrmProva_Shown(object sender, EventArgs e) { dataGridView1.MultiSelect = false; dataGridView1.Rows[dataGridView1.CurrentRow.Index].Selected = true; textBox1.Focus(); } } }

ripeto che a me funziona correttamente per cui il problema va ricercato da un'altra parte.


pedro8a Profilo | Junior Member

Provo ad utilizzare i ltuo codice ti aggiorno

________________________
Pedro8a
Sviluppo per passione

pedro8a Profilo | Junior Member

Il codice funziona, ma c'è un problema come ti dicevo.
Su datagrid vengono visualizzati, per ovvi motivi di spazio, circa 13-15 righe.
Pposizionato sulla textbox, premo freccia giù, arrivo all'ultima riga. Fin qui tutto ok.
Ora premo freccia giù, il programma si posiziona sulla riga successiva, ma il datagrid è fermo, non scorre e ovviamnente non vedo le nuove righe

Grazie

________________________
Pedro8a
Sviluppo per passione
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5