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

Guillamue06 150 Messages postés dimanche 18 avril 2004Date d'inscription 31 mars 2018 Dernière intervention - 15 nov. 2012 à 04:24 - Dernière réponse : Guillamue06 150 Messages postés dimanche 18 avril 2004Date d'inscription 31 mars 2018 Dernière intervention
- 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 

8 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 nov. 2012 à 07:53
0
Utile
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 nov. 2012 à 08:02
0
Utile
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 nov. 2012 à 08:09
0
Utile
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 nov. 2012 à 08:12
0
Utile
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
Guillamue06 150 Messages postés dimanche 18 avril 2004Date d'inscription 31 mars 2018 Dernière intervention - 15 nov. 2012 à 09:13
0
Utile
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
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 15 nov. 2012 à 11:00
0
Utile
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
cs_Le Pivert 5067 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 15 nov. 2012 à 17:01
0
Utile
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
Guillamue06 150 Messages postés dimanche 18 avril 2004Date d'inscription 31 mars 2018 Dernière intervention - 17 nov. 2012 à 06:28
0
Utile
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.