-
@נ-נח יפה מאוד שהצלחת!
עכשיו אתה חייב להבין מה עשית כדי שתבין איך לשנות שהוא יתאים לצרכים שלך.(אגב, הקוד כתוב בצורה לא טובה, (כמובן היא משתמשת רק לדוגמה), כי הוא טוען מיד בהרצה את כל עץ התקייות, וזה יכול להיות פעולה מאוד יקרה.
אבל זה לא כל כך משנה, כי אתה בכל מקרה לא רוצה את העץ.)למעשה אין הרבה תועלת שאני אכתוב את הקוד בשבילך, כי ככה לא תלמוד לפתור דברים בעצמך, אבל מצד שני זה יהיה מאמץ גדול מדי בשבילי להדריך אותך בפרטות כל שלב ושלב, כתבתי רשימה של צעדים נצרכים, ואני מעלה חלק מהקוד והשארתי את השאר בשבילך לשיעורי בית...
רשימת דברים נצרכים:
- שנה את הטופס בצורה שהוא יכלול רק את ה-listView על כל הטופס (תשאיר את ה-imageList שזה נצרך עבור הצגת אייקונים)
- בבנאי של הטופס נקרא לפונקציה בשם:
PopulateListView
במקוםPopulateTreeView
. התוכן של הפונקציה יאכלס את ה-listView ברשימת הקבצים ותיקיות בתיקייה הנבחרת. (יש לנו כבר קוד שעושה את זה בפונקציהTreeView1_NodeMouseClick
אז נעתיק מהקוד ההוא ונתאים אותו להקשר שלנו). - במקום לטפל באירוע של
treeView1.NodeMouseClick
(שזה האירוע של לחיצת עכבר על אבר של ה-treeView ע"ה, שכבר לא קיים), נאזין לאירועlistView1.ItemActivate
שזה האירוע שקורה בלחיצה כפולה על item ב-listView. - לפונקציה שמטפלת באירוע זה, נקרא כמיטב המסורת:
ListView1_ItemActivate
ותוכנו יהיה לקבל את הפרטים על ה-item שעליו לחצת, במקרה וזה תיקייה נרענן את ה-listView להציג את רשימת התוכן של התיקייה (שוב, יש לנו קוד שיודע לעשות את זה, אז נשתמש בה), במקרה וזה קובץ נפתח את הקובץ בתוכנה ברירת מחדל (כרגע, אין לנו קוד לזה, נחפש בגוגל איך עושים את זה...).
בונוסים:
- שנה את הכותרת של הטופס לשם או נתיב של התיקייה הנוכחית
- תגרום שלא יהיה אפשר לבחור יותר משורה אחת, כי אין לנו דרך לטפל באירוע של פתיחת תיקייות מרובות
- מכיון שכבר אין לנו עץ, תוסיף בראש הרשימה אייטם שמייצג את תקיית האבא כדי לתת אפשרות לנווט למעלה לאבא.
קוד דוגמה שכתבתי עבור חלק מהמשימות:
public partial class Form1 : Form { public Form1() { InitializeComponent(); DirectoryInfo info = new DirectoryInfo(@"../.."); PopulateListView(info); this.listView1.ItemActivate += ListView1_ItemActivate; } private void ListView1_ItemActivate(object sender, EventArgs e) { ListView lv = (ListView)sender; ListViewItem item = lv.SelectedItems[0]; if (item.Tag is DirectoryInfo) { DirectoryInfo info = (DirectoryInfo)item.Tag; PopulateListView(info); } } private void PopulateListView(DirectoryInfo info) { listView1.Items.Clear(); if (info.Exists) { foreach (DirectoryInfo dir in info.GetDirectories()) { var item = new ListViewItem(dir.Name, 0) { Tag = dir }; ListViewItem.ListViewSubItem[] subItems = new ListViewItem.ListViewSubItem[] { new ListViewItem.ListViewSubItem(item, "Directory"), new ListViewItem.ListViewSubItem(item, dir.LastAccessTime.ToShortDateString()) }; item.SubItems.AddRange(subItems); listView1.Items.Add(item); } foreach (FileInfo file in info.GetFiles()) { var item = new ListViewItem(file.Name, 1) { Tag = file }; ListViewItem.ListViewSubItem[] subItems = new ListViewItem.ListViewSubItem[] { new ListViewItem.ListViewSubItem(item, "File"), new ListViewItem.ListViewSubItem(item, file.LastAccessTime.ToShortDateString()) }; item.SubItems.AddRange(subItems); listView1.Items.Add(item); } listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } } }
-