Mdificare la risposta dei tasti in una datagridview

domenica 13 gennaio 2008 - 09.38

marcogio Profilo | Newbie



vorrei modificare il ritorno della tastiera in modo tale che quando premo il tasto corrispondente al punto, venga stampata la virgola. Questo mi serve per velocizzare l'inserimento di cifre in euro in un programma.
Ho provato in un textbox e funziona, mentre lo stesso codice, opportunamente adattato, non funziona in una datagridview.

code
--------------
//questo è il codice del textbox che funziona

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 46)
e.KeyChar = (char) 44;
}


//questo è il codice del dataGridView1 che non funziona

void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 46)
e.KeyChar = (char)44;
}

aiedail92 Profilo | Expert

Ciao

il problema è che l'evento datagrid.keydown non si verifica quando viene premuto un tasto mentre la cella sta venendo modificata. Ti consiglio per risolvere il tuo problema di intercettare l'evento datagrid.CellEndEdit (che si verifica qundo viene disattivata la modalità di modifica per la cella selezionata) e inserire qui il codice per sostituire la virgola al punto:

private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DataGridViewCell cell = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex]; cell.Value = cell.Value.ToString().Replace('.', ','); }
Luca

marcogio Profilo | Newbie

non funziona. Ti invio il codice che ho dovuto adattare in quanto l'evento CellEndEdit è già utilizzato

post
.............................

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{

if (e.ColumnIndex == dataGridView1.Columns["modalitaaggiunta"].Index)
{
//recupero il valore contenuto nella cella della modalità
DataGridViewComboBoxCell cellmodalita = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
//risistemo il bs originale non filtrato
cellmodalita.DataSource = bsmodalita;
}

if (e.ColumnIndex == dataGridView1.Columns["cifra"].Index)
{
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.Value = cell.Value.ToString().Replace('.', ',');

}
}

aiedail92 Profilo | Expert

Ciao

Scusa se è passato un bel po' di tempo, magari hai anche già risolto...

Non sono riuscito a capire il tuo codice:

>if (e.ColumnIndex == dataGridView1.Columns["modalitaaggiunta"].Index)
>{
> //recupero il valore contenuto nella cella della modalità
> DataGridViewComboBoxCell cellmodalita = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
> //risistemo il bs originale non filtrato
> cellmodalita.DataSource = bsmodalita;
>}

E poi cos'è che non funziona? Viene lanciata un'eccezione? Se si a che riga?

Luca

marcogio Profilo | Newbie

Come puoi vedere, nel gestore dell'evento cellendedit ci sono due costrutti if.
Il primo appartiene ad un altro progetto. Nel gestore cellbeginedit ho inserito un codice per poter variare i contenuti di un datagridviewComboBoxColumn al variare di un altro dataGridViewComboBoxColumn. Nel gestore cellBeginEnd ho rimesso tutto a posto, cioè ho ripristinato il bindingsource originale.

La seconda parte del codice è quella che ho utilizzato per risolvere il problema. Ho inserito anche il primo if perchè magari potevano darsi fastidio tra di loro. Se così non è, allora sto sbagliando qualcos'altro.

Il codice del secondo if è questo (e non funziona):

code
----------------------------------------------------------------------------------
if (e.ColumnIndex == dataGridView1.Columns["cifra"].Index)
{
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.Value = cell.Value.ToString().Replace('.', ',');

}

ciao, grazie.

aiedail92 Profilo | Expert

Ho provato a fare un test e con me funziona.

Provo a caso: forse la proprietà Name della colonna della quale devi impostare le cifre non è "cifra" (magari c'è qualche maiuscola?).

Prova ad eseguire in debug, impostando un breakpoint a questa riga:

if (e.ColumnIndex == tuoDataGridView.Columns["cifra"].Index)

e controlla se l'istruzione successiva si verifica.

Se non è così aggiungi questa espressone di controllo:

tuoDataGridView.Columns[e.ColumnIndex].Name

Che ti dice quale è il nome della colonna la cui cella è appena stata modificata. Se non corrisponde a "cifra" significa che il nome della colonna della cella modificata non corrisponde.

Fammi sapere i risultati

Luca

marcogio Profilo | Newbie

ho scritto questo codice ed ho inserito un breakpoint dove mi hai detto tu (if(e.ColumnIndex...)




code
------------------

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{

if (e.ColumnIndex == dataGridView1.Columns["cifra"].Index)
{
prova.Text=dataGridView1.Columns[e.ColumnIndex].Name;
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.Value = cell.Value.ToString().Replace('.', ',');

}


}
-----------------------

Ho eseguito il debug e l'istruzione successiva è stata attivata solo quando ho utilizzato la colonna "cifra". La parola "cifra" è apparsa nel toolStripStatusLabel1.text che avevo creato alla bisogna.

Il valore inserito nella cella della colonna "cifra" è 100.36

Il punto (.) però non viene sostituito da una virgola (,).

Il debug fila liscio.

aiedail92 Profilo | Expert

Ciao

Facciamo un'ultima prova:

All'istruzione

cell.Value = cell.Value.ToString().Replace('.', ',');

inserisci un altro BreakPoint e poi quest'altra espressione di controllo:

cell.Value

Quando il debug si ferma premi F10, eseguendo la linea singola.

Se il testo dell'espressione di controllo diventa rosso significa che il cambiamento è avvenuto correttamente e il problema è in quello che succede dopo; se invece il testo rimane nero significa che il cambiamento non c'è proprio stato.

Se il caso è il primo, io non posso più aiutarti, dato che non ho molta esperienza coi database e non conosco bene il funzionamento (ad esempio facendo alcune prove mi è successo che, nel DataGridView, aggiungendo alcune colonne dal Designer e altre col DataSource, quando modifico un valore delle colonne impostate dal designer cambiano anche tutte le altre del designer e la prima del BindingSource )

Se invece il caso è il secondo... beh la cosa è ancora più grave perchè significa che il comando non è proprio stato recepito.

Luca

marcogio Profilo | Newbie

Il testo rimane nero... grazie lo stesso.

aiedail92 Profilo | Expert

L'ultima cosa che mi viene in mente è che possa esserci un qualche riferimento sbagliato (la cella ottenuta fa riferimento a una cella sbagliata?)

Altrimenti mi dispiace, ma non so più cosa pensare.

Magari arriva qualcuno degli esperti, o addirittura un Guru , e ci illumina...

Nel frattempo, prova a spostare il codice per sostituire il punto in uno di questi eventi: CellParsing (generato quando viene disattivata la modalità di modifica, che sia cambiato o meno il contenuto), CellValidated o CellValidating; non si sa mai ...

Luca

dvd75 Profilo | Newbie

Io ho risolto prendendo spunto da quà e funziona perfettamente, ovviamente bisogna prestare attenzione se nella DG ci sono celle impostate su combobox perchè da errore, ma superato questo va tutto liscio
ciao

http://www.settorezero.com/wordpress/vbnet-gestire-levento-di-pressione-dei-tasti-nelle-celle-di-una-datagridview-un-cellkeypress-fatto-in-casa/

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