[WPF/VBNET] - Listview - Ajouté des items simplement ?

Traitée [WPF/VBNET] - Listview - Ajouté des items simplement ?

  • mardi 17 juillet 2012 20:10
    Auteur de réponse
     
     

    Bonjour à tous,

    j'essaie de me mettre au WPF via VB.NET on dit souvent que le WPF est très facile, mais là .... ?????

    J’ai fait quand même pas mal de recherche sur le net sans trouver comment faire au plus simple.
    Quand je crée une listview en WPF avec le concepteur, j'arrive à mettre les columns, puis à passer plus ou moins en mode détail ; puis quand j'essaie d'ajouter des items là c'est le parcours du combattant sans parler des subitems.

    j'ai bien réussi a ajouté un item dans le listview via XAML mais il me le duplique partout, de même quand je passe via le code vb

    Mon listview est composé de 5 columns et j'essaie de remplir la première ligne (item et subitem) sans dupliquer mon ajout, comment faire ?


    Cordialement,

Toutes les réponses

  • mardi 17 juillet 2012 21:53
    Modérateur
     
     

    Bonjour,

    Pouvez-vous nous montrer le code qui vous pose problème ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

  • mercredi 18 juillet 2012 07:18
    Auteur de réponse
     
      A du code

    Bonjour Gilles,

    Voila le resultat

    Le code est relativement simple

    XAML

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="242" Width="452">
        <Grid>
            <ListView Height="159" HorizontalAlignment="Left" Margin="10,10,0,0" Name="ListView1" VerticalAlignment="Top" Width="410" ItemsSource="{Binding}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Columns 1" Width="80" />
                        <GridViewColumn  Header="Columns 2" Width="80"/>
                        <GridViewColumn Header="Columns 3" Width="80"/>
                        <GridViewColumn Header="Columns 4" Width="80"/>
                        <GridViewColumn Header="Columns 5" Width="80"/>
                    </GridView>
                </ListView.View >
                <ListViewItem Content="test1" />
                <ListViewItem Content="test2" />
                <ListViewItem Content="test3" />
                <ListViewItem Content="test4" />
                <ListViewItem Content="test5" />
            </ListView>
        </Grid>
    </Window>
    

    En VBNET le résultat est le même que l'image en haut.

    Class MainWindow 
        Sub New()
    
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
    
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    
        End Sub
    
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            ListView1.Items.Add("test1")
            ListView1.Items.Add("test2")
            ListView1.Items.Add("test3")
            ListView1.Items.Add("test4")
            ListView1.Items.Add("test5")
    
        End Sub
    End Class
    

    En Visual Basic Projet WinForm j'ai juste a faire :

    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            ListView1.Items.Add("test1")
            ListView1.Items.Add("test2")
            ListView1.Items.Add("test3")
            ListView1.Items.Add("test4")
            ListView1.Items.Add("test5")
        End Sub
    End Class

    Pour obtenir :

    J'aimerai avoir la même chose en WPF mais j'arrive pas a comprendre le fonctionnement


    Cordialement,

  • mercredi 18 juillet 2012 23:31
    Modérateur
     
     Traitée A du code

    Bonjour,

    Vous devez créer une classe qui contient les données à afficher (une instance de cette classe représente une ligne dans votre ListView et une propriété de cette classe représente une colonne de votre ListView).

    Au niveau XAML il faut bindé les 2 colonnes via l'attribut DisplayMemberBinding :

    <ListView Height="159" HorizontalAlignment="Left" Margin="10,10,0,0" Name="ListView1" VerticalAlignment="Top" Width="410" ItemsSource="{Binding}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Columns 1" Width="80" DisplayMemberBinding="{Binding Col1}" />
                <GridViewColumn  Header="Columns 2" Width="80" DisplayMemberBinding="{Binding Col2}"/>
            </GridView>
        </ListView.View >
    </ListView>

    Au niveau VB .NET il suffit de mettre ceci :

    Class MainWindow 
    
        Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    
            Me.ListView1.Items.Add(New Data("Col1-1", "Col2-1"))
            Me.ListView1.Items.Add(New Data("Col1-2", "Col2-2"))
    
        End Sub
    
        Private Class Data
    
            Public Sub New(col1 As String, col2 As String)
                Me.Col1 = col1
                Me.Col2 = col2
            End Sub
    
            Public Property Col1 As String
            Public Property Col2 As String
        End Class
    End Class

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse TroxsaEditor jeudi 19 juillet 2012 22:09
    •  
  • jeudi 19 juillet 2012 08:55
    Auteur de réponse
     
     Traitée A du code

    Bonjour Gilles,

    Effectivement c'est ce que j'avais fini par faire (trouver), je vois quand même des différences sur ce que j'ai pu faire (sur le code vb)

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="224" Width="431">
        <Grid>
            <ListView Height="159" HorizontalAlignment="Left" Margin="10,10,0,0" Name="ListView1" VerticalAlignment="Top" Width="385" ItemsSource="{Binding}" IsEnabled="True">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="Columns1" Width="120" DisplayMemberBinding="{Binding Columns1}"/>
                            <GridViewColumn  Header="Columns2" Width="120" DisplayMemberBinding="{Binding Columns2}"/>
                            <GridViewColumn Header="Columns3" Width="120" DisplayMemberBinding="{Binding Columns3}" />
                        </GridView.Columns>
                    </GridView>
                </ListView.View >
            </ListView>
        </Grid>
    </Window>


    et le code vb

    Class MainWindow 
        Sub New()
    
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
    
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    
        End Sub
    
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    
            ListView1.Items.Add(New lvComplet() With {.Columns1 = "Item1", .Columns2 = "item2", .Columns3 = "item3"})
    
        End Sub
    End Class
    
    Class lvComplet
        Public Property Columns1 As String
        Public Property Columns2 As String
        Public Property Columns3 As String
    End Class

    Vous avez fait dans le Data un Sub New et vous avez appeler la class data depuis le load

    InitializeComponent() n'est pas obligatoire en WPF, commet dans vb form ? (comme j'ai fait)


     


    Cordialement,


  • jeudi 19 juillet 2012 22:31
    Modérateur
     
     

    Bonjour,

    L'appel à InitializeComponent() dans le constructeur est obligatoire. Si vous supprimez le constructeur (Sub New) Visual Studio vous le rajoutera automatiquement à la compilation et il fera appel à InitializeCompoment().

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0