Intercettazione su cella datagridview

lunedì 05 luglio 2010 - 13.25

andreadp Profilo | Junior Member

salve a tutti nel mio progetto in c# vorrei catturare la pressione del tasto su una cella di una datagridview per non permettere di usare il punto come separatore decimale.
Non sono stato in grado di capire come funziona keypress però in questo caso (nel caso del text box riesco facilmente)

Grazie a tutti
Andrea

Gluck74 Profilo | Guru

non dipende dalla griglia ma dalla textbox.
ovvero l'evento keypress scatterà sull'eventuale textBox nel quale stai scrivendo.

Per fare una cosa molto carina, dovresti crearti un tuo textBox ereditando da quello standard, ed aggiungi soltanto la gestione dell'evento.
Quindi all'interno del gridView userai soltanto i tuoi textBox.

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Bene. Infatti ho già creato la mia classe ereditata da TextBox. Il problema è : come faccio ad usalrla all'interno del datagrid??
Andrea

Gluck74 Profilo | Guru

usi il controllo come un normalissimo controllo a livello di design.
hai creato solo la classe o anche il file ascx???
in questo caso prendi il file ascx e lo trascini nella pagina a designTime.

Nel primo caso invece ti tocca aggiungere il controllo da codice istanziando la classe ed aggiungendola al punto giusto con "...controls.add(...)"

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

La classe creata mi compare come oggetto nella casella degli strumenti da poter trascinare nel design.
Però mi trascina il textbox come un elemento a parte rispetto al datagridview..(non so se riesco a spiegarmi)..Cioè praticamente trascinando me lo sovrappone alla tabella. COme si fa ad inglobarlo??
Andrea

Gluck74 Profilo | Guru

mettilo dopo la griglia,
poi vai nella vista "source", prendi la riga e la copi all'interno della gridView nei posti giusti.
Dovresti avere
<column> ... <asp:TemplateField ... ... ...> <ItemTemplate> qui ci metti il codice generato del tuo nuovo controllo </ItemTemplate> </asp:TemplateField> ... </column>



controlla però che ti lasci fare il bindign dei dati

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

aspetta io però parlavo di una winForm..Fa lo stesso?
Andrea

Gluck74 Profilo | Guru

e che ci fai dentro il form asp.net???
Non dovrebbe cambiare nulla. Anche nelle winform tu puoi personalizzare le colonne della gridView.
In particolare dove vuoi permettere la scrittura, invece di lasciare un boundColumn, la trasformi in un Template e ci metti il tuo controllo.


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Ma non siamo in winfform.net???????

ps. Potresti essere leggermente più preciso...è la prima volta che faccio un lavoro del genere..e devo entrare un po' nell'ottica...
Andrea

Gluck74 Profilo | Guru

scusa, mi sono confuso io perché prima stato scrivendo su asp.net........
SI SI, siamo su WIN FORM..... he he he

quindi quello che ho detto prima non c'entra nulla!!!!
chiedo umilmente scusa


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Ho una datagridview!
Andrea

Gluck74 Profilo | Guru

Ciao, ho fatto delle prove, e come avevo scritto prima ci sono problemini (è un pochetto troppo complicato perché dovresti andara a sostituire il controllo di editing al momento giusto........)
Lascio quello che avevo scritto prima come "storico delle cacchiate"......
mentre la soluzione giusto è: aggiungi semplicemente nel codice del form, esempio se la griglia si chiama dataGrid1:
private void dataGridView1_EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e) { e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress); } void Control_KeyPress(object sender, KeyPressEventArgs e) { MessageBox.Show("Test"); }

in pratica gestisci semplicemente l'evento EditingControlShowing, ovvero quando vai in modifica, e gli dici che al controllo che appare (visibilmente non appare nulla, ma è nel momento che puoi scrivere nella cella), gli gestisci l'evento keyPress

ciao e buon lavoro



___________________________________________________________________________________

risposta vecchia
___________________________________________________________________________________

quindi, se vai nel file form1.designer.cs, troverai "InitializeComponent" che ti costruisce la tua griglia.

ad esempio una colonna sara:
this.numeroTelefonicoDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();

Vai a guardarti la classe DataGridViewTextBoxColumn, e il tuo nuovo controllo dovrà espandere questa classe (non il textbox come avevo detto prima).

a questo punto, fatta la tua nuova classe che espande quella di default (avrai aggiunto il codice necessario per gestire il keyPress), sostituisci la riga scritta prima con una che usa la tua classe.

e perdonami ancora per la confusione che ho fatto prima

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Ok funziona. Però a differenza delle textbox, gestite in precedenza con questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
sull'evento kepress c'è qualcosa che nn va.
Mi spiego: praticamente mi viene accettato il punto come virgola e non la virgola come accade per le textbox. Cosa dovrei guardare??
Andrea

Gluck74 Profilo | Guru

Probabilmente la CurrentInfo che stai utilizzando è impostata per accettare il punto come separatore decimale.
Dovresti controllare la Culture e se necessario impostarla in italiano se vuoi usare la virgola (piuttosto che quella inglese che usa il punto).


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

e si ma dove imposto la currentInfo?!? Da modifica colonne in datagridview??! In questo caso è impostata, la colonna interessata, come senza formattazione. Lo stesso vale per le text box in cui però funziona tutto bene normalmente.:-(
Andrea

Gluck74 Profilo | Guru

a dire la verità la culture andrebbe impostata per l'intera applicazione.......

comunque per risolvere questo problema, almeno prima di
string decimalSeparator = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;


oppure, invece di usare queste impostazioni, usa direttamente i caretteri "." e "," e intercetta questi.


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

si lo terrò presente per le prossime volte grazie...!
Con quale istruzione lo imposto?!? Domanda sciocca

Andrea

Gluck74 Profilo | Guru

una cosa del genere:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("it-IT");

ma sarebbe meglio impostarla da app.config o a seconda della lingua impostata sul sitema operativo

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

niente non va. Ma perchè i text box si e la datagrid no?!??!

Appena risolvo imposto la culture come setting del progetto..ma diamine perchè non va?!??
Andrea

Gluck74 Profilo | Guru

una domanda.
ma dopo l'istruzione
string decimalSeparator = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
che cosa c'è dentro "decimalSeparator "??????

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

C'è la virgola.. ','
come in effetti dovrebbe essere no!?
Andrea

Gluck74 Profilo | Guru

si infatti.
tu dovresti permettere l'inserimento di numeri e della virgola.
Dipende da come hai implementato la logica nel tuo codice:

Carattere permesso -> passa, altrimenti annulla.

Caratteri non permessi -> annulla, altrimenti passa.


ricontrolla quindi la riga
else if (e.KeyChar.ToString() == decimalSeparator && !((TextBox)sender).Text.Contains(decimalSeparator))
return;


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

I caratteri mi vengono accettati correttamente:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Il problema è nell'istruzione slq di update al database.
Cosa può essere??? cose da pazzi..:-(
Andrea

Gluck74 Profilo | Guru

puoi spiegarti meglio che non ho capito?
il database che fa?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Allora. Praticamente ho una datagrid con un campo modificabile. Premendo su un pulsante faccio un ciclo sul datagrid e vado a fare man mano gli update sul database.
Quando nel campo modificabile inserisco un valore con la , mi da errore nell' istruzione di update.
Andrea

Gluck74 Profilo | Guru

allora dipende da come hai costruito la query di update.
Considera che in ogni caso su SQL la virgola è un separatore di colonne, mentre per i numeri il separatore decimale è SEMPRE il punto

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

eccola qui la query. Cosa c'è che non va?!?
Andrea

Gluck74 Profilo | Guru

non puoi concatenare in questa maniera, sia per questioni si sicurezza, sia perché (credo sia ricarica) il valore che aggiungi, se contiene una virgola, tronca la query.

utilizza i parametri per creare una query e passare dei valori.

qui degli esempi:
http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/
http://asp-net-example.blogspot.com/2008/10/sqlparameter-example-how-to-use.html

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

andreadp Profilo | Junior Member

Funziona tutto perfettamente grazie mille davvero



Andrea
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