[C#] ListView..Items[0].Selected probleempje

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 06-08 10:14
Ben bezig een Winform applicatie te maken waarin je door je drive/directory structuur kan stappen en verschillende type mediafiles af te spelen via WMP. Het is verre van klaar. ;)

Ik heb een probleem met het zetten van de selected item in een ListView. Bij default is er niets geselecteerd als de control verschijnt, en ik dacht, ach het is wel handig om de bovenste vast te selecteren. Kunnen de gebruikers zien dat er iets te selecteren valt.

Effe gekeken hoe het moet, dit zou het moeten doen:

C#:
1
2
lwFilesAndFolders.Items[0].Selected = true;
lwFilesAndFolders.Select();


En het lijkt ook te werken. Scherm komt naar voren, eerrste optie (C:\) is geselecteerd. Cursortoetsen werken zoals verwacht (up/down). Met enter stap je naar een andere drive of in een directory.

Control wordt opnieuw opgebouwd, en de eerste optie is wederom geselecteerd, zoals verwacht. Prima. Echter het probleem is dat je nu twee keer op cursor down moet drukken om de selectie naar beneden te krijgen. Daarna is het weer gewoon zoals verwacht...? Google heeft niets opgeleverd behalve een dozijn keren de verwijzing naar ListView.Select() (die er al in staat -- regel 108-109).

Ik heb de form code maar niet meegepast, die is niet zo spannend.

Het lijkt erop dat de selectie niet aankomt bij verdere navigatie. De control rendert het geselecteerde Item wel, maar selecteerd 'm niet echt. Dus de eerste keer dat naar beneden gaat wordt het geselecteerde item daadwerkelijk geselecteerd (wat onzichtbaar is voor de gebruiker) en de tweede keer naar beneden verplaatst de selectie zich echt.

Iemand suggesties hoe ik dit kan verhelpen?

C#:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
namespace DirViewer
{
    public partial class Form1 : Form
    {
        private StringCollection folderCol;
        private ImageList imageList;
        private ListView lwFilesAndFolders;
        private Label lblCurrentPath;

        public Form1()
        {
            InitializeComponent();

            // Init ListView and folder collection
            folderCol = new StringCollection();
            PaintListView(@"C:\");
            folderCol.Add(@"C:\");

            axWindowsMediaPlayer1.uiMode = "none";
        }

        private void PaintListView(string root)
        {
            try
            {
                ListViewItem lvi;
                ListViewItem.ListViewSubItem lvsi;

                this.lblCurrentPath.Text = root;

                DriveInfo[] allDrives = DriveInfo.GetDrives();
                DirectoryInfo dir = new DirectoryInfo(root);
                DirectoryInfo[] dirs = dir.GetDirectories();
                FileInfo[] files = dir.GetFiles();

                this.lwFilesAndFolders.Items.Clear();
                
                this.lwFilesAndFolders.BeginUpdate();

                // Add available drives
                foreach (DriveInfo di in allDrives)
                {
                    if (di.IsReady)
                    {
                        lvi = new ListViewItem();
                        lvi.ForeColor = Color.Gray;
                        lvi.Text = di.Name;
                        lvi.Tag = di.Name;
                        lvi.ImageIndex = 1;

                        this.lwFilesAndFolders.Items.Add(lvi);
                    }
                }
                
                // Add parent of current directory
                if (root != dir.Root.Name)
                {
                    lvi = new ListViewItem();
                    lvi.ForeColor = Color.Gray;
                    lvi.Text = "[up one level]";
                    lvi.Tag = dir.Parent.FullName;

                    this.lwFilesAndFolders.Items.Add(lvi);
                }

                // Add directories
                foreach (DirectoryInfo di in dirs)
                {
                    if (!di.Attributes.ToString().Contains(FileAttributes.System.ToString()) &&
                        !di.Attributes.ToString().Contains(FileAttributes.Hidden.ToString())
                        )
                    {
                        lvi = new ListViewItem();
                        lvi.ForeColor = Color.Gray;
                        lvi.Text = di.Name;
                        lvi.ImageIndex = 0;
                        lvi.Tag = di.FullName;

                        this.lwFilesAndFolders.Items.Add(lvi);
                    }
                }

                // Add files
                foreach (FileInfo fi in files)
                {
                    lvi = new ListViewItem();
                    lvi.Text = fi.Name.Replace("_", " ");
                    lvi.ForeColor = Color.LightGray;
                    lvi.Tag = fi.FullName;

                    this.lwFilesAndFolders.Items.Add(lvi);
                }
                this.lwFilesAndFolders.EndUpdate();

                if (lwFilesAndFolders.SelectedItems.Count == 0 && lwFilesAndFolders.Items.Count > 0)
                {
                    lwFilesAndFolders.Items[0].Selected = true;
                    lwFilesAndFolders.Select();
                }

            }
            catch (System.Exception err)
            {
                MessageBox.Show("Error: " + err.Message);
            }

            this.lwFilesAndFolders.View = View.Details;
        }

        private void lwFilesAndFolders_ItemActivate(object sender, EventArgs e)
        {
            ListView lw = (ListView)sender;
            if (lw.SelectedItems.Count > 0)
            {
                string filename = lw.SelectedItems[0].Tag.ToString();

                axWindowsMediaPlayer1.Ctlcontrols.stop();

                DirectoryInfo di = new DirectoryInfo(filename);

                if (!di.Exists) // Not a directory, so it probably is a media file -- play
                {
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                    axWindowsMediaPlayer1.fullScreen = true;
                }
                else
                {
                    PaintListView(filename);
                    folderCol.Add(filename);
                }
            }
        }

        private void lwFilesAndFolders_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListView lw = (ListView)sender;

            if (lw.SelectedItems.Count == 1) // Event is triggered twice, make sure we get the one -with- the SelectedItem
            {
                FileInfo fi = new FileInfo(lw.SelectedItems[0].Tag.ToString());
                lblFileName.Text = "";
                if (Library.isValidFiletype(fi.Name))
                {
    // WMP stuff
                }
            }
        }
    }
}

When in question, when in doubt, run in circles, scream and shout.


Acties:
  • 0 Henk 'm!

  • ben15243
  • Registratie: September 2003
  • Laatst online: 17-09 09:11
Ik neem aan dat het Control opnieuw wordt opgebouwd op het moment dat er een directory (en geen bestand) wordt geselecteerd.

Tijdens het opbouwen wordt de ListView leeggehaald (met Items.Clear()) en weer gevuld. Volgens mij verlies je tussen die twee acties de focus van het control. Het lijkt er dan op dat je de focus vervolgens terug krijgt door de eerste keer op cursor down te drukken.

Lang verhaal kort: probeer eens de focus op het control te zetten (met .Focus()) nadat je het SelectedItem hebt ingesteld. :)

Acties:
  • 0 Henk 'm!

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Daarnaast heb je de Select() method niet nodig volgens mij.

Het volgende zou genoeg moeten zijn om het eerste item in de listview te selecteren:

C#:
1
listView.TopItem.Selected = true


En dan heb je volgens mij idd zoals de bovenbuurman zegt nog een extra regeltje code nodig om de focus daarop te krijgen om zo via het toetsenbord door de lijst te kunnen stappen.

[ Voor 30% gewijzigd door mindcrash op 13-05-2009 22:07 ]

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Acties:
  • 0 Henk 'm!

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 06-08 10:14
Bedankt, dat werkt.

C#:
1
2
lwFilesAndFolders.TopItem.Selected = true;
lwFilesAndFolders.TopItem.Focused = true;


Het is duidelijker en makkelijker dan handmatig door ListView.Items[] te lopen en de selected te zetten.

Doet precies waar ik naar zocht. :)

When in question, when in doubt, run in circles, scream and shout.