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

VB.NET Discussion :

intercepter le _Dbg_CellMouseDown(sender As Object, e As Windows.Forms.DataGridViewCellMouseEventArgs) Hand


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut intercepter le _Dbg_CellMouseDown(sender As Object, e As Windows.Forms.DataGridViewCellMouseEventArgs) Hand
    Bonjour,
    J’ai travaillé pendant 10 ans en SSII sur des projets vba !
    Je suis revenu depuis 2 ans dans une société pour laquelle je migre une application VB6 en vb.net.
    Quand je parle de migration, il n’y a plus de références à Vb6 ! Et j’ai l’impression (c’est plus qu’une impression) de devoir tous réapprendre.

    Je veux mutualiser certaines actions répétitives dans une classe qui intercepte les évènements d’un DataGridView. Je ne veux pas créer dynamiquement les contrôles mais gérer des contrôles existant dans un UsF.
    Dites-moi où je pêche !

    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
    Public Sub New(ByRef Dbgc As DataGridView)
            Dbg = Dbgc
        End Sub
        Public Property Dbg As DataGridView
            Get
                Return _Dbg
            End Get
            Set(value As DataGridView)
                _Dbg = value
                AddHandler _Dbg.CellMouseDown, AddressOf _Dbg_CellMouseDown
            End Set
        End Property
     
     
        Protected Sub _Dbg_CellMouseDown(sender As Object, e As Windows.Forms.DataGridViewCellMouseEventArgs) Handles _Dbg.CellMouseDown
            If e.Button = Windows.Forms.MouseButtons.Right Then
                PasteClipboardw()
            End If
        End Sub
    De plus j’ai implémenté la méthode Paste sur ce DataGridView et je trouve le traitement long ! Comment améliorer les performances.
    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
    Private Sub PasteClipboardw()
            Try
                Dim s As String = Clipboard.GetText()
                Dim lines As String() = s.Split(Environment.NewLine)
                Dim iFail As Integer = 0, iRow = _Dbg.CurrentCell.RowIndex
                Dim iCol As Integer = _Dbg.CurrentCell.ColumnIndex
                Dim oCell As DataGridViewCell
                Dim i As Integer = 0, c As Integer = 0
                For i = 0 To lines.LongCount - 1
                    If iRow + i = _Dbg.RowCount Then
                        _Dbg.DataSource.Rows.Add(_Dbg.DataSource.NewRow())
                        _Dbg.Refresh()
                    End If
                Next
                i = 0
                For Each line As String In lines
                    Dim sCells As String() = line.Split(Convert.ToChar(Keys.Tab))
                    c = 0
                    For Each Col As String In sCells
                        oCell = _Dbg(iCol + c, iRow + i)
                        oCell.Value = FormaterChamp(Convert.ChangeType(Col.ToString, oCell.ValueType))
                        c += 1
                    Next
                    i += 1
                Next
                _Dbg.Refresh()
            Catch ex As Exception
     
            End Try
        End Sub

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Effectivement le passage de vb6 à vbnet ne doit pas être commode, pourtant en te croisant ça et là j'étais loin d'imaginer que tu es issu de la vieille (et bonne) école

    Tu veux externaliser le traitement et l'interception des données dans une autre classe..., o_O pourquoi ne pas tout bonnement (puisque tu dis vouloir traiter l'interception d'évents de contrôles datagdridview) étendre la classe Datagdridview (= créer une classe qui hérite du datagridview) dans laquelle tu ajoutes les méthodes en attribut Shadows afin d'intercepter les traitements ?
    PS1 : il faudra éventuellement mettre en place 1 Event(+Delegate) pour la récupération côté UI...à voir...

    PS2 : Je suis dispo cet après-midi donc si tu as 5 minutes, communiques-moi un soupçon de projet que je puisse mieux appréhender ce qui gravite autour de ta question.

    Cdlt.

  3. #3
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    +1 pour wallace1

    Sinon, pour le côté plus rapide, tu pourrais faire le même algo, mais avec une seul boucle...
    En faisant NewRow, tu renseignes en même temps les infos en direct.

    et le dgv.refresh est il nécessaire à chaque création de ligne?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    +1 pour wallace1

    Sinon, pour le côté plus rapide, tu pourrais faire le même algo, mais avec une seul boucle...
    En faisant NewRow, tu renseignes en même temps les infos en direct.

    et le dgv.refresh est il nécessaire à chaque création de ligne?
    oui c'est ce que j'avais fait à l’origine mais les données de la dernière ligne qui ce déplace vers le bas et le nouvelle valeur qui ne s'inscrivaient pas!

    hormis le temps que m'économiserais une simple boucle, vu temps d’écriture du paste je ne risque pas d'avoir une épilepsie en regardants l’encrant! comme ma base de données de teste est synchronisé avec celle de prod , je travail avec de vraies échantillons!

    effectivement j'ai bien vu que le refresh est inutile.

    vue que je suis encore dans l'analyse, je teste des moreaux de code pour le compulser après la rédaction des spécificités, ce qui explique ce code un peut fouillis!

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    De retour,

    Donc pour en revenir à nos moutons :

    Ton projet parait un poil + complexe donc tu comprendras que n'ayant pas tout les éléments je ne peux qu'essayer de simplifier la chose. Voilà un projet exemple très simpliste (je veux dire par là , pour les puristes qu'il n'est pas optimisé ) :

    --> Il contient :

    1 classe étendue du contrôle datagridview avec une méthode déclarée Shadows qui intercepte le MouseDown
    1 form principal + un bouton pour ouvrir le form contenant les 2 DGV
    1 form sur lequel il y 2 DGV créés dynamiquement (avec remplissage de 2 colonnes et qq lignes pour illustrer l'exemple)

    --> cela illustre comment :

    - intercepter le MouseDown & RightClick depuis la classe étendue DataGridViewEx
    - rapatrier l'interception du MouseDown All Click des DGV d'un form dans le form principal

    http://wallace87000.upd.fr/DGV_Project.7z

    Désolé je n'avais pas trop le temps de commenter.... j'ai fais au mieux.

    ++

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok j'ai d quoi potasser, je te tiens au courant.
    Un grand merci en touts cas.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour wallace1 et merci pour ta réponse.,

    mon application est architecturé autour d'un projet enveloppe qui contient toute les fonctionna liées communes!

    un certain nombre de librairies (DLL) contiennent de fonctionnalités particulière Edition.dll, Administration.Dll, Etc.Dll...

    Code NewDbg : 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
    Imports System
    Imports System.Drawing
    Imports System.Windows.Forms
    Imports System.Globalization
    Public Class NewDbg
        Friend WithEvents _Dbg As DataGridView
        Public Sub New(ByRef Dbgc As DataGridView)
            Dbg = Dbgc
        End Sub
     
        Public Property Dbg As DataGridView
            Get
                Return _Dbg
            End Get
            Set(value As DataGridView)
                _Dbg = DirectCast(value, System.Windows.Forms.Control)
                AddHandler _Dbg.CellMouseDown, AddressOf MyDown
     
            End Set
        End Property
        Private Sub MyDown(sender As Object, e As Windows.Forms.DataGridViewCellMouseEventArgs)
            If e.Button = Windows.Forms.MouseButtons.Right Then
                PasteClipboardw()
            End If
        End Sub
        Private Sub PasteClipboardw()
            Try
                Dim s As String = Clipboard.GetText()
                Dim lines As String() = s.Split(Environment.NewLine)
                Dim iFail As Integer = 0, iRow = _Dbg.CurrentCell.RowIndex
                Dim iCol As Integer = _Dbg.CurrentCell.ColumnIndex
                Dim oCell As DataGridViewCell
                Dim i As Integer = 0, c As Integer = 0
                For i = 0 To lines.LongCount - 1
                    If iRow + i = _Dbg.RowCount Then
                        _Dbg.DataSource.Rows.Add(_Dbg.DataSource.NewRow())
                        _Dbg.Refresh()
                    End If
                Next
                i = 0
                For Each line As String In lines
                    Dim sCells As String() = line.Split(Convert.ToChar(Keys.Tab))
                    c = 0
                    For Each Col As String In sCells
                        oCell = _Dbg(iCol + c, iRow + i)
                        oCell.Value = FormaterChamp(Convert.ChangeType(Col.ToString, oCell.ValueType))
                        c += 1
                    Next
                    i += 1
                Next
                _Dbg.Refresh()
            Catch ex As Exception
            End Try
        End Sub
        Private Function FormaterChamp(Champ As Object) As Object
            Dim provider As CultureInfo = CultureInfo.InvariantCulture, e As Exception
            Dim V As String = ""
            Select Case Champ.GetType.Name
                Case "DBNull" : Return "Null"
                Case "Boolean" : Try : Return Boolean.Parse(Champ).ToString.Replace("True", True).Replace("False", False) : Catch e : End Try
                Case "Decimal", "Int32" : Return Champ.ToString.Replace(",", ".")
                Case "DateTime" : Try : Return "#" + Date.Parse(Champ) + "#" : Catch e : End Try
                Case Else : Return Champ
            End Select
            Return Nothing
        End Function
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Sub UsfPrincipal_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Cn = New RdAdodb(True) ' SqlConnection
            Dim m As New Metier
            Dim ed As New EditeurDLL.Editeur()
            ed.Connexion = Cn
            Dim NewMDIChild As Object = ed.UsF
    Dim EdC As New NewDbg(ed.UsF.MyDataGridView1) 'L'instance dans la sub pas bon mais même en dehors ça marche pas! 
    Dim EdD As New NewDbg(ed.UsF.MyDataGridView2)
            NewMDIChild.MdiParent = Me
            NewMDIChild.Show()
        End Sub
    Dernière modification par Invité ; 22/04/2016 à 15h58.

  8. #8
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    @rdurupt : ah... d'accord tu vois j'avais même pas imaginé que ton constructeur de ton 1er post pouvait être encapsulé dans un héritage de form......

    .... bon là je quitte le taf...je reviens après sans pb.

    PS : on a tendance à s'oublier derrière ce fichu écran, même au boulot...^^

    ++

Discussions similaires

  1. Object "ligne" windows form
    Par Persnip77 dans le forum C++/CLI
    Réponses: 20
    Dernier message: 16/06/2011, 10h14
  2. Réponses: 1
    Dernier message: 17/12/2010, 11h56
  3. Réponses: 0
    Dernier message: 11/12/2010, 12h58
  4. Réponses: 0
    Dernier message: 11/12/2010, 12h52
  5. Réponses: 11
    Dernier message: 06/05/2009, 17h13

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