Class datagridcomboboxcolumnstyle pour un datagrid

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 446 fois - Téléchargée 27 fois

Contenu du snippet

Voici une modification d'une source que j'ai trouvé sur ce site et qui permet de créer une ComboBoxColumn pour un DataGrid et qui marche pour une table source à une seule colonne.
Pour l'utiliser, il faut écrire, dans le code de création du DataGrid le code suivant :

'Ajout de la comboboxcolumn au DataGrid1
Dim DataComboBoxColumn As New DataGridComboBoxColumn(Table_source_de_la_combobox)

DataComboBoxColumn.MappingName = "Nom_de_la_colonne_liée"
DataComboBoxColumn.HeaderText = "Texte_de_l'entête_de_colonne"
DataComboBoxColumn.NullText = ""
DataComboBoxColumn.Width = largeur de la colonne
DataGrid1.DataGridTableStyle.GridColumnStyles.Add(DataComboBoxColumn)

Source / Exemple :


Imports System
Imports System.Data
Imports System.Windows.Forms
Imports System.Drawing
Imports System.ComponentModel

Public Class DataGridComboBoxColumn
    Inherits System.Windows.Forms.DataGridTextBoxColumn

    Dim Combo As New ComboBox
    Private DG As New DataGrid
    Private DT As New DataTable
    Private varTable As DataTable
    Private IsEditing As Boolean

#Region " Code généré par le Concepteur Windows Form "

    Public Sub New(ByVal DTtype As DataTable, ByVal DGtype As DataGrid)

        MyBase.New()
        DT = DTtype
        DG = DGtype
        'Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        'Ajoutez une initialisation quelconque après l'appel InitializeComponent()

    End Sub

    'La méthode substituée Dispose du UserControl pour nettoyer la liste des composants.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Requis par le Concepteur Windows Form
    Private components As System.ComponentModel.IContainer

    'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
    'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
    'Ne la modifiez pas en utilisant l'éditeur de code.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        '
        'DataGridComboBoxColumn
        '
        components = New System.ComponentModel.Container
        Combo.DataSource = DT
        Combo.DisplayMember = DT.Columns(0).ToString
        Combo.ValueMember = DT.Columns(0).ToString
        Combo.Visible = False
        IsEditing = False

    End Sub

#End Region

    Protected Overrides Sub Abort(ByVal rowNum As Integer)

    End Sub

    'Enregistre la valeur sélectionnée dans la table liée et rend la comboBox invisible
    Protected Overrides Function Commit(ByVal dataSource As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Boolean

        If IsEditing = True Then
            SetColumnValueAtRow(dataSource, rowNum, Me.Combo.SelectedValue)
            Combo.Visible = False
            IsEditing = False
        End If
        Return True
    End Function

    Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)

        Try
            If cellIsVisible Then
                Me.Combo.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height)
                Me.Combo.SelectedIndex = 0
                Me.Combo.Visible = True
                Me.Combo.SelectedValue = GetColumnValueAtRow(source, rowNum)
            End If
        Catch ex As Exception
            Me.Combo.SelectedIndex = 0
        End Try
        IsEditing = True

    End Sub

    'Affiche la valeur dans la cellule du DataGrid
    Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal alignToRight As Boolean)

        Try

            Dim clef As Object
            Dim valeur As String
            Dim rect As Rectangle = bounds
            Dim rectF As RectangleF
            Dim strFormat As New StringFormat

            clef = GetColumnValueAtRow(source, rowNum)

            If clef Is DBNull.Value OrElse clef Is Nothing Then
                g.FillRectangle(backBrush, rect)
                Exit Sub
            Else
                With strFormat
                    If alignToRight Then
                        .Alignment = StringAlignment.Far
                    Else
                        Select Case Me.Alignment
                            Case HorizontalAlignment.Center
                                .Alignment = StringAlignment.Center
                            Case HorizontalAlignment.Left
                                .Alignment = StringAlignment.Near
                            Case Else
                                .Alignment = StringAlignment.Far
                        End Select
                        .FormatFlags = .FormatFlags Or StringFormatFlags.NoWrap
                    End If
                End With
                valeur = Combo.SelectedValue
                g.FillRectangle(backBrush, rect)
                rect.Offset(0, 2)
                rect.Height -= 2
                Paint(g, bounds, source, rowNum, False)
            End If

        Catch ex As Exception
            MessageBox.Show(ex.ToString, "Erreur d'Affichage des données")
        End Try

    End Sub

    Protected Overrides Sub SetDataGridInColumn(ByVal value As DataGrid)

        value.Controls.Add(Combo)

    End Sub

End Class

A voir également

Ajouter un commentaire

Commentaires

Messages postés
113
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
6 mars 2008

Dans mon cas, la combo disparaît bien lorsque je clique sur la cellule suivante. Par contre, je n'ai pas testé avec le scrollbar lorsque l'ensemble des colonnes n'est pas affiché. Je vais regarder.
N'étant pas informaticien mais un passionné, je ne sais pas si j'arriverai à trouver une solution. Autrement, si quelqu'un a une idée, qu'il la poste.

Pour la disparition de la combo, je ne sais pas, il faudrait faire un test sur la variable isEditing pour savoir si elle prend la valeur true.
Messages postés
63
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
16 novembre 2007

Il y a aussi des soucis lorsque l'ensemble des colonnes n'est pas afficher et qu'il faut utiliser la scrollbar
Messages postés
63
Date d'inscription
lundi 13 septembre 2004
Statut
Membre
Dernière intervention
16 novembre 2007

oui j'ai une cellule apres le combo effectivement y'a un remede docteur?
Messages postés
113
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
6 mars 2008

Je viens de regarder un peu plus finement par rapport à mon utilisation, losque j'ai choisi une ligne dans la combo, celle-ci ne disparaît, mais lorsque tu cliques sur la cellule qui suit, la combo disparaît.
Dans ton cas Totochito, as-tu une cellule après le combo?

Botanique
Messages postés
113
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
6 mars 2008

Dans mon utilisation, la combo disparaît lorsque l'on quitte la cellule, mais je vais me pencher sur ta remarque et je mettrai un commentaire.
Merci totochito pour ta remarque qui va me permettre d'améliorer ma classe.
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.