IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET][VS2005] Locker une colonne d'un Datagridview


Sujet :

Windows Forms

  1. #1
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut [VB.NET][VS2005] Locker une colonne d'un Datagridview
    Bonjour.

    Je charge un datagridview :
    - à partir d'une table
    - en créant dynamiquement les colonnes du datagridview (par code)

    Pour certaines colonnes, je ne souhaite pas que les données soit modifiées donc je positionne : macolonne.readonly = true
    Je souhaite qu'elle soit visible ( donc macolonne.visible = true) mais par contre, je ne souhaite pas qu'il soit possible de tabuler sur cette colonne --> c'est là que je bloque !

    Ma colonne est bien en readonly, visible, mais par contre elle est accessible via touches de déplacement et tabulations (je cherche en fait un truc du genre macolonne.enabled = false comme en Access)

    J'ai cherché au niveau des propriétés des DataGridViewColumn et du DataGridViewTextBoxColumn mais cette fonctionnalité ne semble pas existée nativement.

    Une idée ?
    (Ca me décevrait de devoir gérer des sauts de colonnes à la main !)

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Aprés avoir creuser profond, il s'avère qu'effectivement, on ne peut pas locker facilement une cellule d'un datagridview !
    j'ai essayé de créer un classe heritée de la Datagridviewcell mais rien à faire ! La gestion du déplacement est au niveau du datagridview (c'est lui qui trappe les touches de déplacement en fait).

    Je me suis donc tourné vers une gestion à la main dans l'évènement KeyDown du datagridview... (j'évite les colonnes en readonly en positionnant la currentcell par code sur frappe d'une touche de déplacement)

    C'est moyen mais ça marche en attendant plus propre.

  3. #3
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bon je la mets résolu avec le code :

    Nota :
    AppDataGrid est un DataGridView
    stCorrDII est une SortedList(Of Integer, Integer) qui donne l'index des colonnes suivant leur displayindex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    '
    ' Ceci permet d'interdire d'accéder à la cellule aprés l'édition de la précédente 
    ' ou clic de la souris
    '
        Private Sub AppDataGrid_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
                If e.RowIndex >= 0 And e.ColumnIndex >= 0 Then
                If AppDataGrid.Columns(e.ColumnIndex).ReadOnly Then
                    SendKeys.Send(Chr(9))
                End If
            End If
        End Sub
     
        Private Sub AppDataGrid_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles AppDataGrid.KeyDown
            '
            ' On force a rester sur la même ligne si la derniere colonne est en readonly
            '
            With e
                If .KeyCode <> Keys.Right _
                And .KeyCode <> Keys.Left _
                And .KeyCode <> Keys.Tab Then Exit Sub
     
                e.Handled = True
     
                Dim cCC As Integer = AppDataGrid.Columns(AppDataGrid.CurrentCell.ColumnIndex).DisplayIndex
                Dim rCC As Integer = AppDataGrid.CurrentCell.RowIndex
                '
                ' gestion déplacement vers la droite
                '
                If .KeyCode = Keys.Right Or .KeyCode = Keys.Tab Then
                    Me.AppDataGrid.CurrentCell = Me.AppDataGrid(findRigthNextEnabledColumn(cCC), rCC)
                End If
                '
                ' gestion déplacement vers la gauche
                '
                If .KeyCode = Keys.Left Or (.KeyCode = Keys.Tab And .Shift) Then
                    Me.AppDataGrid.CurrentCell = Me.AppDataGrid(findLeftNextEnabledColumn(cCC), rCC)
                End If
     
            End With
     
        End Sub
     
        '
        ' GESTION DES DEPLACEMENTS VERS LES COLONNES READONLY
        '
        Private Function findRigthNextEnabledColumn(ByVal CurrentColDisplayIndex As Integer) As Integer
            Dim c As Integer = CurrentColDisplayIndex
            Do
                c += 1
                If c > Me.AppDataGrid.Columns.Count - 1 Then
                    Return stCorrDII(CurrentColDisplayIndex)
                End If
                If Not Me.AppDataGrid(stCorrDII(c), Me.AppDataGrid.CurrentCell.RowIndex).ReadOnly _
                    And Me.AppDataGrid(stCorrDII(c), Me.AppDataGrid.CurrentCell.RowIndex).Visible Then
                    Return stCorrDII(c)
                End If
            Loop
        End Function
        Private Function findLeftNextEnabledColumn(ByVal CurrentColDisplayIndex As Integer) As Integer
            Dim c As Integer = CurrentColDisplayIndex
            Do
                c -= 1
                If c < 0 Then
                    Return stCorrDII(CurrentColDisplayIndex)
                End If
                If Not Me.AppDataGrid(stCorrDII(c), Me.AppDataGrid.CurrentCell.RowIndex).ReadOnly _
                    And Me.AppDataGrid(stCorrDII(c), Me.AppDataGrid.CurrentCell.RowIndex).Visible Then
                    Return stCorrDII(c)
                End If
            Loop
        End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Calculs dans une colonne d'un datagridview
    Par boulete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 15h11
  2. [Debutant] vb.net couleur d'une colonne flexgrid
    Par bestsimo2 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/06/2005, 18h27
  3. [ADO.Net][VB.NET] Comment ajouter une colonne Integer à un DataTable ?
    Par graphicsxp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/04/2005, 12h08
  4. [VB.NET] Accès à une colonne d'un DataGrid
    Par fabthebreton dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2004, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo