Autor Beitrag
marsmoon
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 07.04.08 14:55 
Hi,

habe folgendes Problem.

Ich möchte in einem ListView das TopItem abfragen.
Das funzt auch erstmal ganz gut. Wenn ich aber ein ListView mit Groups
benutze, dann erhalte ich immer den TopItem.Index = 0 zurück.
Ich benutze .net 2.0.
Kennt da jemand nen Trick um sich auch in gruppierten ListViews das TopItem zu merken?

Gruß marsmoon
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 07.04.08 15:19 
Hallo und :welcome:

Wenn ich das richtig sehe, greift TopIndex auch nur auf eine Funktion der Windows-API zu. :nixweiss:

Was man machen kann ist sowas:
ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
  for li : ListViewItem in listView1.Items do
    if li.Position.Y > 0 then
    begin
      MessageBox.Show(li.Text);
      exit;
    end;

Wenn Du allerdings einen Header hast, musst Du nicht gegen 0 vergleichen, sondern gegen die Höhe des Headers. Die müsstest Du dann noch heraus bekommen.

Grüße
Christian

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



BeitragVerfasst: Mo 07.04.08 17:11 
Hi,

danke für die schnelle Antwort. Leider werde ich daraus auch nicht schlau.
Deshalb zeige ich Euch mein Problem anhand eines Beispiels.
Einfach ne winform mit einem button erstellen.
Dann die class Form1 durch diese hier ersetzen.
Wenn man dann in dem ListView bis Eintrag 50 z.B. vorscrollt und dann den Button drückt,
wird das ListView komplett neu erstellt und die Pos 50 wird wieder angezeigt.

Wenn man aber das ganze mit einer Gruppe (hier Test) versucht dann springt er immer auf Pos 0.
Zum Testen mit einer Gruppe die Komentare lesen.

Wenn mir hier einer sagen kann wie ich in diese Zeile (merker = myListView.TopItem.Index;
) bei eingeschalteter Gruppierung den richtigen Wert bekomme oder wie ich diese Zeile umändern muss, dann ....
wäre ich zu ewigem Dank verpflichtet :-)

Beispiel:

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:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            InitializeListView();
        }
        internal System.Windows.Forms.ListView myListView;

        private void InitializeListView()
        {

            myListView = new ListView();
            myListView.Location = new System.Drawing.Point(2020);
            myListView.Width = 250;

            myListView.View = View.Details;

            this.myListView.Columns.Add("Key"50, HorizontalAlignment.Left);
            this.myListView.Columns.Add("A"100, HorizontalAlignment.Left);
            this.myListView.Columns.Add("B"100, HorizontalAlignment.Left);

            ListViewGroup gruppe = new ListViewGroup();
            gruppe.Header = "Test";

            // für Gruppierung aktivieren --> myListView.Groups.Add(gruppe);

            for (int i = 0; i < 100; i++)
            {
                
                // für Gruppierung aktivieren --> ListViewItem entryListItem = new ListViewItem();

                ListViewItem entryListItem = myListView.Items.Add("Items"); // <-- für Gruppierung deaktivieren
                
                entryListItem.Text = "Items";

                entryListItem.UseItemStyleForSubItems = false;

                ListViewItem.ListViewSubItem expenseItem =
                    entryListItem.SubItems.Add("Expense");

                expenseItem.ForeColor = System.Drawing.Color.Red;
                expenseItem.Font = new System.Drawing.Font(
                    "Arial"10, System.Drawing.FontStyle.Italic);

                ListViewItem.ListViewSubItem revenueItem =
                    entryListItem.SubItems.Add("Revenue" + i);

                revenueItem.ForeColor = System.Drawing.Color.Blue;
                revenueItem.Font = new System.Drawing.Font(
                    "Times New Roman"10, System.Drawing.FontStyle.Bold);

                // für Gruppierung aktivieren --> gruppe.Items.Add(entryListItem);
                // für Gruppierung aktivieren --> myListView.Items.Add(gruppe.Items.Add(entryListItem));

            }

            this.Controls.Add(this.myListView);
        }
        int merker = 0;
        private void button1_Click(System.Object sender, System.EventArgs e)
        {
            merker = myListView.TopItem.Index;
            myListView.Dispose();
            InitializeListView();
            myListView.TopItem = myListView.Items[merker];
        }
    }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 07.04.08 19:05 
Dein Problem war mir schon klar, obiger Code-Schnipsel sollte Dir auch bei aktivierter Gruppierung den Index des TopItems liefern.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".