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 :

Ecrire dans une DataGridViewComboBoxColumn


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Par défaut Ecrire dans une DataGridViewComboBoxColumn
    J'ai une datagridview avec une DataGridViewComboBoxColumn.
    Les items de la DataGridViewComboBoxColumn sont alimentés par le code et non bindés à une bd. Je ne parviens pas à donner la possibilité à l'utilisateur d'écrire dans cette DataGridViewComboBoxColumn qui est dispo pour les combobox classique. Est ce possible ?

    Quelle pourrait être une alternative?

    Merci de m'éclairer.

  2. #2
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Il y a effectivement moyen : c'est expliquer dans la présentation (point 17) du DataGridView par Microsoft (dispo dans les exemples windowsform) :
    http://www.windowsforms.net/Samples/...View%20FAQ.doc

    Par contre, c'est trés moyen, car il faut coder tout ça dans le DataGridView alors que finalement, c'est plutôt des propriétés liées à la colonne !

    Donc personnellement, je me suis fait un class héritée du DataGridViewComboBoxColumn qui encapsule tout ça (en fait il me faut déclarer le type Column, Cell et editingcontrol). Ca semble lourd mais c'est propre. Je ne peux pas te poster mon code car trop spécifique à mon appli (gestion de paramétres perso), ça ne t'avancerai pas, mais si tu es bloqué, je te ferai un petit bout de code tout propre à partir du mien.

    Cdt.

  3. #3
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Salut olsimare !

    Si tu nous prépares un petit code "générique", on pourrait mettre ça dans notre rubrique source .NET, ça servirait à beaucoup de monde je pense !

  4. #4
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Ok Fred ça roule...

    Je mets tout ça au propre de suite.

    Je le poste où aprés ?

    Cdt.

  5. #5
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut AllowWritingDGVCBColumn version béta !
    Yop !

    Voilà le code.

    C'est moyen mais bon ça marche pas trop mal.

    Il s'agit donc d'une classe héritée du datagridviewcomboboxcolumn qui permet la saisie de valeurs non dans la source et qui entraîne la maj de la base dans la foulée --> donc le datasource de la column doit être un dataadaptater basé sur une requête qui rend une seule colonne (cf. exemple). C'est logique car dans ma version plus complexe, je dois en absence de l'item dans la liste débrancher sur un formulaire spécifique de création de l'item et ça complique de beaucoup le code.

    Mais bon, ça aide à comprendre le principe...

    ATTENTION : C'est du vite fait je garantis pas l'absence de bugs !

    Donc les classes pour la colonne :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    Option Strict On
    Option Explicit On
    Imports System
    Imports System.Data.OleDb
    #Region "AllowWritingDGVCB"
    '
    ' Colonne de type liste avec chargement dynamique
    '
    Public Class AllowWritingDGVCBEditingControl
        Inherits DataGridViewComboBoxEditingControl
        Implements IDataGridViewEditingControl
        Private dataGridViewControl As DataGridView
        Private valueIsChanged As Boolean = False
        Private cColumn As AllowWritingDGVCBColumn
     
        Friend WriteOnly Property Column() As AllowWritingDGVCBColumn
            Set(ByVal value As AllowWritingDGVCBColumn)
                cColumn = value
            End Set
        End Property
        Protected Overrides Sub OnTextChanged( _
        ByVal e As EventArgs)
            valueIsChanged = True
            Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
        End Sub
        Protected Overrides Sub OnPreviewKeyDown( _
        ByVal e As PreviewKeyDownEventArgs)
            If e.KeyCode = Keys.Tab Or e.KeyCode = Keys.Enter Then
                Me.OnLeave(New EventArgs)
            End If
        End Sub
        Protected Overrides Sub OnLeave( _
        ByVal e As EventArgs)
            ChekValue()
            MyBase.OnLeave(e)
        End Sub
        Protected Sub ChekValue()
            '
            ' Gestion du chargement dynamique
            '
            Dim dtTable As DataTable = CType(Me.DataSource, DataTable)
            Dim dvTable As New DataView(dtTable)
            dvTable.RowFilter = dtTable.Columns(0).ColumnName & "='" & Me.Text & "'"
     
            ' La valeur est trouvée dans la source --> rien a faire
            If dvTable.Count > 0 Then Exit Sub
     
            ' La valeur n'est pas trouvée dans la source --> on l'insére
            '
            Dim strText As String = Me.Text
            cColumn.AddNewSourceItem(strText)
            ' Ruse a 20 centimes car l'update provoque le rechargement de la liste
            ' et le changement de la valeur éditée.
            ' Ceci provoque un appel réentrant mais j'ai pas mieux pour l'instant !
            ' --> piste = remove du handler sur changement de text ?
            Me.Text = strText
     
        End Sub
        Public Overrides Function EditingControlWantsInputKey(ByVal key As Keys, _
            ByVal dataGridViewWantsInputKey As Boolean) As Boolean
     
            Select Case key And Keys.KeyCode
                Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
                    Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp, _
                    Keys.Enter, Keys.Tab
                    Return True
                Case Else
                    Return False
            End Select
        End Function
     
    End Class
     
    Public Class AllowWritingDGVCBColumn
        Inherits DataGridViewComboBoxColumn
     
        Private daListe As OleDbDataAdapter
        Private cbListe As OleDbCommandBuilder
        Private dsListe As New DataSet
        Private myCnn As New OleDbConnection
        Private bsListe As New BindingSource
     
        Public Sub New()
            MyBase.New()
            MyBase.CellTemplate = New AllowWritingDGVCBCell
        End Sub
        Public Overloads WriteOnly Property DataSource() As Object
            Set(ByVal value As Object)
                If Not TypeOf (value) Is OleDbDataAdapter Then
                    MsgBox("Erreur le datasource doit etre un OleDbDataAdapter ")
                    Exit Property
                End If
                daListe = CType(value, OleDbDataAdapter)
                cbListe = New OleDbCommandBuilder(daListe)
                daListe.Fill(dsListe)
                Me.ValueMember = dsListe.Tables(0).Columns(0).ColumnName
                Me.DisplayMember = dsListe.Tables(0).Columns(0).ColumnName
                MyBase.DataSource = dsListe.Tables(0)
            End Set
        End Property
     
        Friend Sub AddNewSourceItem(ByVal value As String)
            dsListe.Tables(0).Rows.Add(value)
            daListe.Update(dsListe)
        End Sub
     
    End Class
     
    Public Class AllowWritingDGVCBCell
        Inherits DataGridViewComboBoxCell
     
        Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
            ByVal initialFormattedValue As Object, _
            ByVal dataGridViewCellStyle As DataGridViewCellStyle)
     
            MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
                dataGridViewCellStyle)
     
            Dim col As AllowWritingDGVCBColumn = _
            CType(MyBase.DataGridView.Columns(MyBase.ColumnIndex), AllowWritingDGVCBColumn)
     
            Dim ctl As AllowWritingDGVCBEditingControl = _
                CType(DataGridView.EditingControl, AllowWritingDGVCBEditingControl)
            ctl.DropDownStyle = ComboBoxStyle.DropDown
            ctl.AutoCompleteMode = AutoCompleteMode.None
            ctl.Column = CType(Me.DataGridView.Columns(Me.ColumnIndex), AllowWritingDGVCBColumn)
     
        End Sub
        Public Overrides ReadOnly Property EditType() As Type
            Get
                Return GetType(AllowWritingDGVCBEditingControl)
            End Get
        End Property
     
    End Class
     
    #End Region
    Et un formulaire de test Form4 avec un datagridview Datagridview1 :

    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
     
    Option Strict On
    Option Explicit On
    Imports System
    Imports System.Data.OleDb
     
    Public Class Form4
     
        Private daListe As OleDbDataAdapter
        Private myCnn As New OleDbConnection
        Private Sub Form4_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
     
     
            ' Connexion à la base
            myCnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\Add\Add\Suivi Projet\Suivi Projet AF.mdb"""
            myCnn.Open()
            '
            ' Création de l'adaptateur pour alim du datasource de la colonne 
            '
            Dim strSqlQuery As String = "SELECT col1 FROM Table1"
            Try
                ' adaptateur pour la base de donnée
                daListe = New OleDbDataAdapter(New OleDb.OleDbCommand(strSqlQuery, myCnn))
            Catch ex As Exception
                MsgBox("Ca alors ! Une erreur : " & ex.Message)
            End Try
     
            ' Crée la colonne dans le datagridview 
            Dim c As New AllowWritingDGVCBColumn
            c.DataSource = daListe
            Me.DataGridView1.Columns.Add(c)
     
        End Sub
     
    End Class
    J'espére faire avancer le chmilblick !

    Cdt.

  6. #6
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Salut olsimare !

    J'espére faire avancer le chmilblick !
    N'en doute pas !

    Par contre faudra que je prenne le temps vérifier si on peut pas faire un peu plus générique. Du style éviter de d'utiliser un DataAdapter dans la classe.

    On en reparle plus tard, là j'ai pas trop la tête à ça.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Par défaut Reponse en C#
    Bonjour, j'arrive un peu tard mais je viens d'avoir le souci et je vous apporte une réponse relativement simple en c#.

    ajoutez ceci à votre datagridview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void dataGridView1_EditingControlShowing
            (object sender,
            DataGridViewEditingControlShowingEventArgs e) {
     
            DataGridViewComboBoxEditingControl comboControl
                = e.Control as DataGridViewComboBoxEditingControl;
            if (comboControl != null) {
                // Set the DropDown style to get an editable ComboBox
                if (comboControl.DropDownStyle != ComboBoxStyle.DropDown) {
                    comboControl.DropDownStyle = ComboBoxStyle.DropDown;
                }
            }
        }
    La source est ici

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Par défaut
    C'est génial.
    Merci steep0001.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 08/02/2006, 16h59
  2. ecrire dans une listbox
    Par amigauss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/01/2006, 17h48
  3. [VB] Ecrire dans une ComboBox -> Combo = TexBox
    Par zejo63 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/01/2006, 11h25
  4. [MySQL] Comment ecrire dans une BDD à partir d'un tableau ?
    Par weed dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 16/09/2005, 15h53
  5. Réponses: 4
    Dernier message: 15/04/2005, 15h25

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