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:
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?
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.