Autor Beitrag
Klinge
Hält's aus hier
Beiträge: 6

WinVistaHome SP1
VC# 2005 Express
BeitragVerfasst: Di 10.03.09 16:59 
Hallo,

ich habe ein einfaches ListView mit 3 Spalten.
Nun möchte ich per Knopfdruck eine Zeile hinzufügen.
Anstatt die Werte auf die Spalten zu verteilen, zeigt er überall nur den Klassentyp an.
Was muss ich ändern?

Hier der Code:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<Window x:Class="ListViewEx.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="302" Width="491">
    <Grid>
        <ListView Margin="25,23,227,18" Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="70" Header="Column 1" />
                    <GridViewColumn Width="70" Header="Column 2" />
                    <GridViewColumn Width="70" Header="Column 3" />
                </GridView>
            </ListView.View>
        </ListView>
        <Button Height="23" HorizontalAlignment="Right" Margin="0,44,47,0" 
            Name="btnAdd" VerticalAlignment="Top" Width="120" Click="btnAdd_Click">Add Item</Button>
        <Button Height="23" HorizontalAlignment="Right" Margin="0,102,47,0" 
            Name="btnChange" VerticalAlignment="Top" Width="120" Click="btnChange_Click">Change Item</Button>
    </Grid>
</Window>


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
using System.Windows;
using System.Collections.Generic;

namespace ListViewEx
{
    public class person
    {   
        public string firstname;
        public string lastname;
        public string city;
        public person(string first, string last, string ci)
        {
            firstname = first;
            lastname = last;
            city = ci;
        }
    }

    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        List<person> persLst;

        public Window1()
        {
            InitializeComponent();

            persLst = new List<person>();
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            person ps = new person("Harry","Schnell","");
            persLst.Add(ps);
            listView1.Items.Add(ps);
        }

        private void btnChange_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.03.09 17:46 
Wie wäre es, wenn du auch den String hinzufügst, der da angezeigt werden soll? :gruebel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
            person ps = new person("Harry","Schnell","");
            persLst.Add(ps);
            ListViewItem myItem = listView1.Items.Add(ps.lastname);
            myItem.SubItems.Add(ps.firstname);
...
So oder so ähnlich sollte das aussehen. Ausprobiert hab ich es nicht.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 10.03.09 18:32 
Du hast ja noch nicht mal eine ToString-Methode implementiert, woher soll die Listview wissen, was sie anzeigen soll?

Am einfachsten geht es mittels Databinding:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
        <ListView Margin="25,23,227,18" Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="70" Header="Column 1" DisplayMemberBinding="{Binding Path=Firstname}" />
                    <GridViewColumn Width="70" Header="Column 2" DisplayMemberBinding="{Binding Path=Lastname}"/>
                    <GridViewColumn Width="70" Header="Column 3" DisplayMemberBinding="{Binding Path=City}"/>
                </GridView>
            </ListView.View>
        </ListView>


Grüße
Christian

P.S.: @jaenicke: Das wäre wahrscheinlich eher in WinForms der Weg.
P.P.S.: Es dürfte auch besser sein, die ListView an eine ObservableCollection zu binden und nur in diese die Daten einfzufügen, anstatt immer eine List und die Listview separat aktualisieren zu müssen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.03.09 18:38 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
P.S.: @jaenicke: Das wäre wahrscheinlich eher in WinForms der Weg.
Ja, dass es in Silverlight eine solche Möglichkeit gibt, wusste ich nicht. ;-)
// EDIT:
Ok, dann WPF, aber ich bin erstmal nur mit WinForms am werkeln. ;-)


Zuletzt bearbeitet von jaenicke am Di 10.03.09 18:45, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 10.03.09 18:42 
Dem Xaml nach zu urteilen, würde ich sagen, ist das kein Silverlight, sondern normales WPF. Sonst wäre der Root-Tag IIRC ne Page.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Klinge Threadstarter
Hält's aus hier
Beiträge: 6

WinVistaHome SP1
VC# 2005 Express
BeitragVerfasst: Mi 11.03.09 11:19 
Danke für Eure Antworten.

Bevor ich das Binding benutze, möchte ich erst mal die normale Variante mit Zuweisung kennenlernen.

Die zentrale Frage ist offenbar, wie definiere ich die SubItems, um sie dann einem ListViewItem hinzuzufügen.
Da hab ich noch keine Möglichkeit gefunden.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 11.03.09 13:17 
Binding ist der normale Weg in WPF.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Klinge Threadstarter
Hält's aus hier
Beiträge: 6

WinVistaHome SP1
VC# 2005 Express
BeitragVerfasst: Mi 11.03.09 17:49 
Mit Binding funktioniert es leider noch weniger. Da bleibt das ListView nämlich leer.

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
<Window x:Class="ListViewBindEx.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:ListViewBindEx"
    Title="Window1" Height="368" Width="444">

    <Window.Resources>
        <ObjectDataProvider x:Key="prov" ObjectType="{x:Type local:PersonList}"/>
    </Window.Resources>
    
    <Grid>
        <ListView Margin="28,25,180,53" Name="listView1"
            ItemsSource="{Binding Source={StaticResource prov}}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="70" Header="First name" DisplayMemberBinding="{Binding Path=Person.firstname}"/>
                    <GridViewColumn Width="70" Header="Last name" DisplayMemberBinding="{Binding Path=Person.lastname}"/>
                    <GridViewColumn Width="70" Header="City" DisplayMemberBinding="{Binding Path=Person.city}"/>
                </GridView>
            </ListView.View>    
        </ListView>
        <Button Height="23" HorizontalAlignment="Right" Margin="0,57,30,0" Name="btnAddItem" VerticalAlignment="Top" Width="124" Click="btnAddItem_Click">Add Item</Button>
        <Button Height="23" HorizontalAlignment="Right" Margin="0,130,30,0" Name="btnChangeItem" VerticalAlignment="Top" Width="124">Change Item</Button>
    </Grid>
</Window>


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
using System.Windows;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace ListViewBindEx
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public PersonList persLst;

        public Window1()
        {
            InitializeComponent();

            persLst = new PersonList();
        }

        private void btnAddItem_Click(object sender, RoutedEventArgs e)
        {
            Person ps = new Person("Harry""Schnell""Berlin");
            persLst.Add(ps);
        }
    }

    public class PersonList : ObservableCollection<Person> {}

    public class Person
    {
        private string firstname { get; set; }
        private string lastname { get; set; }
        private string city { get; set; }
        public Person(string first, string last, string ci)
        {
            firstname = first;
            lastname = last;
            city = ci;
        }
    }
}


Wie kann man einen Binding-Fehler finden? Debuggen geht wohl nicht, oder?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 11.03.09 19:17 
Die Properties der Klasse sollten public sein, außerdem brauchst Du im Binding das "Person." davor nicht.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 11.03.09 19:36 
Zusätzlich zu Christians Punkten: Du lässt dir vom ObjectDataProvider eine neue Instanz deiner Listen-Klasse erstellen, die logischerweise leer ist. Lass den Provider weg und setze im Code-Behind listView1.ItemsSource = persLst;.
Oder noch schöner: setze this.DataContext = persLst;. Durch Property Inheritance bekommt dann auch die ListView diesen DataContext, binden kannst du an ihn dann mit ItemsSource="{Binding}". Damit befindest du dich auf halbem Weg zum MVVM-Pattern.

user profile iconKlinge hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann man einen Binding-Fehler finden? Debuggen geht wohl nicht, oder?
bea.stollnitz.com/blog/?p=52

_________________
>λ=
Klinge Threadstarter
Hält's aus hier
Beiträge: 6

WinVistaHome SP1
VC# 2005 Express
BeitragVerfasst: Do 12.03.09 10:17 
Hallo liebe Helfer!

Jetzt funkt es! Dass ich die Properties public machen muss, das ist mir noch eingefallen.
Aber dass man ItemSource nochmal angeben muss, wo es doch schon im xaml-File steht,
da wär ich alleine nie drauf gekommen.
Dann erschienen auch zum ersten Mal Fehlermeldungen im Ausgabefenster,
dass ich im Pfad das Person. weglassen muss.
Vielen Dank für Eure Unterstützung!