Meilleur auteur de réponses
Liens multiples dans un DataGridView

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
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
-
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- Marqué comme réponse Gilles TOURREAUModerator dimanche 5 décembre 2010 22:11
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 -
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 -
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 -
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 -
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 -
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
-
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- Marqué comme réponse Gilles TOURREAUModerator dimanche 5 décembre 2010 22:11