Sélectionner SubItem d'une listview [Résolu]

Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Dernière intervention
25 juillet 2018
- 15 nov. 2012 à 04:24 - Dernière réponse :
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Dernière intervention
25 juillet 2018
- 17 nov. 2012 à 06:28
Bonjour, j'ai une listview avec un view "detail" comme le montre l'image : depuis dropbox

Je souhaiterais pouvoir sélectionner un subitem de cette liste (11, 22, 33, 44...) afin de connaitre quelle donnée l'utilisateur souhaite modifier.

Le souci et que seul le premier item (0000000 ou 00000018) et sélectionnable (mais pas les subitem).

Une personne à t'il une solution au problème ?
Merci d'avance.
Afficher la suite 

Votre réponse

8 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 15 nov. 2012 à 07:53
0
Merci
Bonjour,
A ma connaissance (c'est ce que je constate sous VB6, par exemple), seuls les items sont cliquables. Mais il est toujours possible, bien évidemment, de connaître la valeur de chaque subitem d'un item cliqué.
Ce que tu peux faire, par contre, pour parvenir à :
connaitre quelle donnée l'utilisateur souhaite modifier

procéder en deux temps :
1) click sur l'entête de la colonne concernée et utiliser l'évènement ColumnClick pour en extraire le n° de colonne (appelons-le C )et le garder en mémoire
2) click sur l'item ==>> extraire L = ListView1.SelectedItem ===>> traiter ListView1.ListItems(L).SubItems(C)

Une autre méthode pourrait être mise en place, mais de manière plus tarabiscotée, au MouseDown, puisque tu connais les coordonnées de la souris et les largeurs des colonnes ===>> un petit calcul arithmétique ===>> tu connais le N° de colonne. Le N° de ligne sera dans le même temps relevé au click sur la listview (donc 2 relevés en cliquant : un au mousedown et l'autre au click).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 15 nov. 2012 à 08:02
0
Merci
Désolé, mais après essai, le click ailleurs que sur un item ne retourne que la ligne du dernier sélectionné ===>> donc pas bon et il va falloir tout faire au MouseDown;
le 1) précédent reste valable pour la détermination de la colonne
Pour la détermination de la ligne, toutefois, tu n'échapperas pas à à un deuxième calcul arithmétique dont les facteurs seront :
- les coordonnées de la souris dans la listview
- l'épaisseur de la bordure supérieure + intermédiaire si entêtes
- la hauteur graphique de chaque ligne (dépendant de la police de caractère)
voilà ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 15 nov. 2012 à 08:09
0
Merci
Re-désolé :
un facteur de plus à inclure pour le calcul : l'index du 1er élément visible (à partir de GetFirstVisible), bien sûr.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 15 nov. 2012 à 08:12
0
Merci
J'utiliserais volontiers, à ta place, Une MSFlexGrid, beaucoup plus souple à traiter pour ce que tu cherches à faire.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Dernière intervention
25 juillet 2018
- 15 nov. 2012 à 09:13
0
Merci
Merci d'avoir pris la peine de me répondre .

En réfléchissant je vais faire bien plus simple (niveau programmation et utilisateur) : Au lieu que l'utilisateur sélectionne une à une chaque données qu'il souhaite modifier, il clique sur la ligne (qui elle est sélectionnable) et là le formulaire s'ouvre avec 18 textbox des 18 données de la ligne (à la place d'un seul textbox d'une seul donnée).

Merci encore.
Commenter la réponse de Guillamue06
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Dernière intervention
9 avril 2017
- 15 nov. 2012 à 11:00
0
Merci
Jacques a raison, regarde les DataGridView : colonnes sélectionnables et modifiables si elles sont en mode TextBox.
Après, c'est toi qui voit ce qui est le plus adapté.

_____________
Kenji
Commenter la réponse de Charles Racaud
Messages postés
5530
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 15 nov. 2012 à 17:01
0
Merci
Bonjour,
Il est possible de récupérer la colonne, la ligne et le texte d'un subitem. Cela t'éviteras tes 18 TextBox.
Voici le code de démonstration:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With Me.ListView1

            'Setup listview properties
            .View = View.Details
            .Dock = DockStyle.Fill
            .GridLines = True
            .FullRowSelect = True

            'Add columns
            For i As Integer = 0 To 5
                .Columns.Add("Col " & i)
            Next

            'Add rows
            For y As Integer = 0 To 15
                Dim objLvi As New ListViewItem
                objLvi.Text = "Cell " & "0" & "," & y
                For x As Integer = 1 To 5
                    objLvi.SubItems.Add("Cell " & x & "," & y)
                Next
                .Items.Add(objLvi)
            Next
        End With

    End Sub

    Private Sub ListView1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick
        Dim col As Integer = getClickedColumn(Me.ListView1, e.X)
        Dim row As Integer = Me.ListView1.SelectedIndices(0)
        Dim cellText As String = Me.ListView1.Items.Item(row).SubItems.Item(col).Text

        MsgBox("col " & col & ", row " & row & _
               Environment.NewLine & _
               "text = " & Chr(34) & cellText & Chr(34))

    End Sub
    Private Function getClickedColumn(ByVal pListView As ListView, ByVal pMouseX As Integer) As Integer
        Dim result As Integer = 0

        'Get column rights
        Dim colRights As New List(Of Integer)
        Dim colWidths As New List(Of Integer)
        For Each col As ColumnHeader In pListView.Columns
            colWidths.Add(col.Width)
            Dim colRight As Integer = 0 ' - pListView.Columns.Item(0).Width 'Subtract this if you were collecting lefts instead of rights
            For i As Integer = 0 To colWidths.Count - 1
                colRight += colWidths(i)
            Next
            colRights.Add(colRight)
        Next

        'Which column does the mouse X fall inside?
        Dim colIndex As Integer = 0
        For Each colRight As Integer In colRights
            If pMouseX <= colRight Then
                result = colIndex
                Exit For
            End If
            colIndex += 1
        Next

        Return result
    End Function


End Class




@+ Le Pivert
Commenter la réponse de cs_Le Pivert
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Dernière intervention
25 juillet 2018
- 17 nov. 2012 à 06:28
0
Merci
Bon pour le coup j'utilise une dataGridView

J'avoue que sur le coup cette objet me faisait peur car m'était inconnu mais il est bien plus flexible et adapté pour se que je souhaite faire en effet.
Commenter la réponse de Guillamue06

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.