+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

[VB Expr 2010] Datagridview e input controllato su colonne

  1. #1
    L'avatar di vbrookie
    vbrookie non è in linea Scolaretto
    Buonasera a tutti,
    breve messaggio per un problema semplice...ma non per me.
    ho un datagridview che contiene varie colonne. Vorrei che su 2 di queste colonne fosse possibile inserire solo numeri e non lettere o caratteri non numerici. Qualcuno può aiutarmi?
    Grazie...
    Ultima modifica di elisab; 07-06-2011 00:20 

  2. #2
    L'avatar di sistemista
    sistemista non è in linea Topo di biblioteca
    I dati come vengono inseriti,direttamente nella DGV oppure da Textbox e poi successivamente
    manipolati?
    ℹ️ Leggi di più su sistemista ...

  3. #3
    Quote Originariamente inviato da vbrookie Visualizza il messaggio
    ho un datagridview che contiene varie colonne. Vorrei che su 2 di queste colonne fosse possibile inserire solo numeri e non lettere o caratteri non numerici.
    Esistono diverse strade per risolvere il problema.

    Anzitutto la premessa, che credo al 99% corrisponda al senso della tua richiesta : stiamo parlando della possibilità di intercettare in fase di Edit l'inserimento di caratteri direttamente in Cella.

    Se le cose stanno così, uno dei sistemi più semplici è appoggiarsi all'Evento EditingControlShowing() .
    In questo caso si ha a disposizione e.Control, che si può trattare alla stregua di una TextBox, e quindi gestirne un apposito Handler che punta a KeyPress().
    Al di là della spiegazione, il codice da implementare è veramente snello e semplice.

    Supponiamo che "DGV" sia il nostro DataGridView, e che le Colonne ad indice 0 e 1 accettino soltanto caratteri numerici + caratteri di controllo ( bisogna dare la possibilità di spostarsi con gli Arrows, e di usare Canc, Delete, ecc... ) :

        Private Sub DGV_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGV.EditingControlShowing
    
            If DGV.CurrentCellAddress.X = 0 Or DGV.CurrentCellAddress.X = 1 Then
                RemoveHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
                AddHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
            End If
    
        End Sub
    
    Questo per gli Handlers, e poi possiamo gestirci il nostro Metodo DGVEditCellKeyPress come ci pare :

       Private Sub DGVEditCellKeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
            If Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then e.Handled = True
       End Sub
    
    Chiaramente, in presenza di questa e altre caratteristiche "personalizzate", più che andare a sviluppare "dietro la Form" meglio farsi una Classe propria che eredita da DataGridView.

    ℹ️ Leggi di più su MarcoGG ...

  4. #4
    L'avatar di elisab
    elisab non è in linea Topo di biblioteca
    Ciao
    posto una soluzione alternativa che avevo trovato tempo fa: Re: How to permit only numeric characters in a DataGridViewTextBoxColumn column?

    Mi sono fatta tradurre il codice in vb.net
    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports System.Windows.Forms

    Namespace AxUtils.Controls
    ''' <summary>
    ''' DataGridViewNumericTextBoxColumn is a type of column specialized for
    ''' holding DataGridViewNumericTextBoxCells.
    ''' </summary>
    <DataGridViewColumnDesignTimeVisible(True)> _
    Public Class DataGridViewNumericTextBoxColumn
    Inherits DataGridViewTextBoxColumn
    Public Sub New()
    MyBase.New()
    CellTemplate = New DataGridViewNumericTextBoxCell()
    End Sub

    Public Overrides Property CellTemplate() As DataGridViewCell
    Get
    Return MyBase.CellTemplate
    End Get
    Set(ByVal value As DataGridViewCell)
    ' Ensure that the cell used for the template is a DataGridViewNumericTextBoxCell.

    If value IsNot Nothing AndAlso Not value.[GetType]().IsAssignableFrom(GetType(DataGridViewNumericTextBoxCell)) Then
    Throw New InvalidCastException("Must be a DataGridViewNumericTextBoxCell")
    End If
    MyBase.CellTemplate = value
    End Set
    End Property
    End Class



    ''' <summary>
    ''' DataGridViewNumericTextBoxCell represents the individual
    ''' cells within a DataGridViewNumericTextBoxColumn. The cell is
    ''' what appears when the cell is in a non-editable (ie a display)
    ''' state.
    ''' </summary>
    Public Class DataGridViewNumericTextBoxCell
    Inherits DataGridViewTextBoxCell
    Public Sub New()
    MyBase.New()
    End Sub

    ''' <summary>
    ''' Specify the type of object used for editing. This is how the WinForms
    ''' framework figures out what type of edit control to make.
    ''' </summary>
    Public Overrides ReadOnly Property EditType() As Type
    Get
    Return GetType(DataGridViewNumericTextBoxEditingControl)
    End Get
    End Property

    Public Overrides ReadOnly Property ValueType() As Type
    Get
    Return GetType(System.Double)
    End Get
    End Property

    ''' <summary>
    ''' Specify the default cell contents upon creation of a new cell.
    ''' </summary>
    Public Overrides ReadOnly Property DefaultNewRowValue() As Object
    Get
    Return 0
    End Get
    End Property

    'public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    '{
    ' // Set the value of the editing control to the current cell value.
    ' base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
    ' DataGridViewNumericTextBoxEditingControl ctl =(DataGridViewNumericTextBoxEditingControl)DataGridView.EditingControl;
    ' if (ctl != null)
    ' ctl.Text = this.Value.ToString() ;
    '}
    End Class


    ''' <summary>
    ''' This is the control that is created when one of the numeric column's cells
    ''' is edited by the user.
    ''' </summary>
    Public Class DataGridViewNumericTextBoxEditingControl
    Inherits DataGridViewTextBoxEditingControl
    Public Sub New()
    MyBase.New()
    End Sub

    Private Function IsValidForNumberInput(ByVal c As Char) As Boolean
    Return [Char].IsDigit(c) OrElse c = ControlChars.Back OrElse c = "."c OrElse c = "-"c
    End Function

    Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
    If Not IsValidForNumberInput(e.KeyChar) Then
    e.Handled = True
    End If
    End Sub
    End Class
    End Namespace

    '=======================================================
    'Service provided by Telerik (www.telerik.com)
    'Conversion powered by NRefactory.
    'Twitter: @telerik, @toddanglin
    'Facebook: facebook.com/telerik
    '=======================================================

    Nella firma leggi la nota per copiare il codice
    ℹ️ Leggi di più su elisab ...

  5. #5
    L'avatar di vbrookie
    vbrookie non è in linea Scolaretto
    Grazie ad entrambi.
    Da buon italiano ho scelto la soluzione più veloce, quindi quella di MarcoGG. C'è una cosa, però, che non mi torna ed è probabile che questo possa dipendere da una mia omissione iniziale:il mio datagridview è composto da 9 colonne ma solo due di queste devono accettare solo numeri (più tasti di controllo). Mi sono accorto che adoperando la soluzione di MarcoGG quando digito nella quarta colonna (che deve accettare solo numeri) tutto funziona bene ma se mi sposto sulla prima colonna (che può accettare sia lettere che numeri) questa non funziona più nel senso che accetta anch'essa SOLO NUMERI. Naturalmente mi sono perso...

  6. #6
    Quote Originariamente inviato da vbrookie Visualizza il messaggio
    C'è una cosa, però, che non mi torna ed è probabile che questo possa dipendere da una mia omissione iniziale:il mio datagridview è composto da 9 colonne ma solo due di queste devono accettare solo numeri (più tasti di controllo). Mi sono accorto che adoperando la soluzione di MarcoGG quando digito nella quarta colonna (che deve accettare solo numeri) tutto funziona bene ma se mi sposto sulla prima colonna (che può accettare sia lettere che numeri) questa non funziona più nel senso che accetta anch'essa SOLO NUMERI. Naturalmente mi sono perso...
    Basta che modifichi :

    If DGV.CurrentCellAddress.X = a Or DGV.CurrentCellAddress.X = b Then
    ...
    
    dove a e b sono gli indici desiderati per le due Colonne "numeriche"...
    ℹ️ Leggi di più su MarcoGG ...

  7. #7
    L'avatar di elisab
    elisab non è in linea Topo di biblioteca
    Ciao Marco
     Private Sub DGV_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGV.EditingControlShowing

    If DGV.CurrentCellAddress.X = 0 Or DGV.CurrentCellAddress.X = 1 Then
    RemoveHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
    AddHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
    End If

    End Sub

    c'è un altro problema perchè passando dalla colonna 0 o 1 ad un'altra non rimuovi l'handler e continui a controllare l'input.

    O lo si rimuove comunque (non mi sembra che vengano sollevate eccezioni se l'handler non era mai stato aggiunto)
     Private Sub DGV_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGV.EditingControlShowing
    RemoveHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress

    If DGV.CurrentCellAddress.X = 0 Or DGV.CurrentCellAddress.X = 1 Then
    AddHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
    End If

    End Sub


    Altrimenti io li rimuovo nell'evento leave dell'EditingControl, come in questo esempio
    ℹ️ Leggi di più su elisab ...

  8. #8
    Quote Originariamente inviato da elisab Visualizza il messaggio
    O lo si rimuove comunque (non mi sembra che vengano sollevate eccezioni se l'handler non era mai stato aggiunto)
     Private Sub DGV_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGV.EditingControlShowing
    RemoveHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress

    If DGV.CurrentCellAddress.X = 0 Or DGV.CurrentCellAddress.X = 1 Then
    AddHandler e.Control.KeyPress, AddressOf DGVEditCellKeyPress
    End If

    End Sub
    Vero. Pirla io che ce l'ho lasciato.
    No, non vengono sollevate eccezioni. Voto per la RemoveHandler fuori dall'If.
    ℹ️ Leggi di più su MarcoGG ...

  9. #9
    L'avatar di vbrookie
    vbrookie non è in linea Scolaretto
    Come sempre PERFETTO. Ho provato la soluzione e funziona alla stragrande. Grazie davvero ad entrambi. Ma, purtroppo per voi, credo che ci risentiremo...GRAZIE !!!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 2
    Ultimo Post: 04-04-2013, 13:04
  2. [VB Expr 2010] Creazione e gestione file PDF
    Da vbrookie nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 11-06-2011, 19:41
  3. Risolto: [VB 2010 Expr] HScrollBar1.Value non raggiunge il massimo
    Da Smith nel forum Visual Basic .Net
    Risposte: 6
    Ultimo Post: 06-06-2011, 09:31
  4. [VBE2008] DataGridView e controllo input
    Da vbrookie nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 31-12-2008, 03:49
  5. [C/C++] Input Controllato!
    Da gheldrya nel forum C/C++
    Risposte: 2
    Ultimo Post: 22-12-2005, 09:24