none
Liens multiples dans un DataGridView RRS feed

  • Question

  • Bonjour,

    Dans mon appli VB.NET, j'ai une DataTable qui est connectée à un DataGridView.

    La table contient du texte qui représente des liens. Par exemple une cellule du DataGridView peut avoir la forme : lien1-lien2. Où lien1 et lien2 correspondent à des liens différents, vers des objets (dans mon cas des images) différents.

    Comment programmer ceci et rendre les deux liens opérationnels ?

    Merci de vos conseils.


    Alain
    mercredi 17 novembre 2010 18:30

Réponses

  • Bonjour,

    Essayez de regarder la méthode HitTestInfo() : http://msdn.microsoft.com/fr-fr/library/system.windows.forms.datagridview.hittestinfo.aspx elle renvoi des informations sur le DataGridView en fonction des coordonnées de la souris.

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Proposé comme réponse Alex Petrescu vendredi 19 novembre 2010 10:54
    • Marqué comme réponse AchLog vendredi 19 novembre 2010 14:00
    mercredi 17 novembre 2010 22:43
    Modérateur
  • Ok, Ok, Merci Gilles, encore une fois vous êtes le bon conseil !

    Voici: j'ai calculé CurPos, la position relative du curseur dans la cellule

        Dim pos As Point = CType(sender, Control).PointToClient(MousePosition)
        Dim hit As DataGridView.HitTestInfo = dgv.HitTest(pos.X, pos.Y)
        Dim CurPos As Point = New Point(pos.X - hit.ColumnX, pos.Y - hit.RowY)
    
    

    Ensuite, par le biais de MesureTextSize j'ai déterminé quel string était survolé par la souris :

      Private Function CursorIsOver(ByVal src As String, ByVal X As Integer) As Boolean
        Dim g As Graphics = Me.CreateGraphics
        Dim s As Size = DataGridViewCell.MeasureTextSize(g, src, dgv.DefaultCellStyle.Font, TextFormatFlags.Default)
        Dim r As Boolean = X < s.Width
        g.Dispose()
        Return r
      End Function
    
    

    Donc voilà, ça marche et il n'est pas très difficile de placer plusieurs liens dans une cellule.

    Encore merci

     


    Alain
    vendredi 19 novembre 2010 13:58

Toutes les réponses

  • Bonjour,

    J'ai du mal à comprendre ce qu'est pour vous un lien... Est-ce un lien hypertexte ? Un lien entre deux lignes ? Le clic d'un lien provoque l'affichage d'une image ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 17 novembre 2010 21:02
    Modérateur
  • Bonsoir Gilles,

    Oui, c'est un lien hypertexte. Un exemple de liens dans une cellule : "pl 890", qui correspond à un seul lien ou encore "pl123-pl456" qui correspond à deux liens.

    Si on clique sur pl123, le programme exécute l'application qui affiche l'image PL123.JPG qui se trouve dans un répertoire ad hoc.

    Si l'utilisateur clique sur pl456, c'est alors l'image PL456.JPG qui doit être affichée.

    Sur l’évènement Click sur une cellule du DataGridView, je récupère le contenu de la cellule, j'en déduit le nom de l'image à afficher et j'exécute l'application qui correspond. Cela fonctionne bien lorsqu'il n'y a qu'un seul lien dans la cellule. Je ne sais pas comment faire lorsqu'il y en a plusieurs. Mais il doit y avoir une solution simple... 

    Autrement dit : comment placer plusieurs liens dans une même cellule ?

    Est-ce plus clair ? 

    Merci de votre aide.


    Alain
    mercredi 17 novembre 2010 21:49
  • Bonjour,

    Maintenant c'est beacoup plus clair.

    Pour ce genre de fonctionnalité il faudra créer et programmer une colonne qui gère deux liens hypertextes (c'est possible, mais c'est complexe et ca demande pas mal de temps). Ne pouvez-vous pas utiliser deux colonnes plustôt ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 17 novembre 2010 21:59
    Modérateur
  • Je préférerais bien n'utiliser qu'une seule colonne car il peut y avoir un nombre variable de liens et, d'autre part, j'ai déjà d'autres colonnes...

    Je pourrais gérer cela si au moins je pouvais connaitre la position du curseur dans la cellule. Je n'ai pas encore réussi à l'obtenir. Avez-vous une idée ?

    Merci de votre aide fidèle

     


    Alain
    mercredi 17 novembre 2010 22:09
  • Pour info, voici le code que j'ai mis en place.

      Private Sub dgv_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellContentClick
    
        If IsCellValide(e) Then
          Dim value As Object = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
          If value.GetType IsNot GetType(DBNull) Then
            Dim str As String = CType(value, String)
            If str.Length > 0 Then
              Select Case e.ColumnIndex
                Case 1 : GoToEspèce(str)    ' Click sur une espèce
                Case 2 : GoToPlanche(str)    ' Click sur une planche
                Case 3 : GoToFiche(str)     ' Click sur une fiche
              End Select
            End If
          End If
        End If
    
      End Sub
    
    
      Private Sub GoToPlanche(ByVal src As String)
    
        If src.StartsWith("pl.") Then
          Dim Tdec As String() = src.Substring(3).Split("-")
          For Each t As String In Tdec
            If t.Length > 0 Then
              Try
                Dim dec As Integer = CDec(t)
                Dim cible As String = PathRep & "Atlas_Planches\PL " & dec.ToString("#000") & ".jpg"
                Process.Start(cible)
              Catch ex As Exception
              End Try
            End If
          Next
        End If
      End Sub
    
    


    Alain
    mercredi 17 novembre 2010 22:17
  • Bonjour,

    Essayez de regarder la méthode HitTestInfo() : http://msdn.microsoft.com/fr-fr/library/system.windows.forms.datagridview.hittestinfo.aspx elle renvoi des informations sur le DataGridView en fonction des coordonnées de la souris.

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Proposé comme réponse Alex Petrescu vendredi 19 novembre 2010 10:54
    • Marqué comme réponse AchLog vendredi 19 novembre 2010 14:00
    mercredi 17 novembre 2010 22:43
    Modérateur
  • Ok, Ok, Merci Gilles, encore une fois vous êtes le bon conseil !

    Voici: j'ai calculé CurPos, la position relative du curseur dans la cellule

        Dim pos As Point = CType(sender, Control).PointToClient(MousePosition)
        Dim hit As DataGridView.HitTestInfo = dgv.HitTest(pos.X, pos.Y)
        Dim CurPos As Point = New Point(pos.X - hit.ColumnX, pos.Y - hit.RowY)
    
    

    Ensuite, par le biais de MesureTextSize j'ai déterminé quel string était survolé par la souris :

      Private Function CursorIsOver(ByVal src As String, ByVal X As Integer) As Boolean
        Dim g As Graphics = Me.CreateGraphics
        Dim s As Size = DataGridViewCell.MeasureTextSize(g, src, dgv.DefaultCellStyle.Font, TextFormatFlags.Default)
        Dim r As Boolean = X < s.Width
        g.Dispose()
        Return r
      End Function
    
    

    Donc voilà, ça marche et il n'est pas très difficile de placer plusieurs liens dans une cellule.

    Encore merci

     


    Alain
    vendredi 19 novembre 2010 13:58