אירוע Scroll ל- ListView
שלום רב אני מתכנת בשפת C# בסביבת Visual Studio 2005. אני זקוק לאירוע Scroll של ListView שאני אדע מתי ערך פס הגלילה של הפקד משתנה. נדהמתי לגלות שבפקד לא ממומש אירוע כזה באופן מובנה. אחרי חיפושים אינסופיים באינטרנט ולמידת הנושא לעומק, הבנתי שצריך לממש את האירוע בעצמי. הכוונה היא לכתוב מחלקה חדשה שיורשת מ- ListView, להגדיר בה delegate ו- event של Scroll ולממש קוד שיפעיל את האירוע כשצריך. עם זאת עדיין לא הצלחתי להגיע לתוצאה מושלמת. הסברים על הקוד: namespace Win32 - מכיל הגדרות שנלקחו מקובצי C++ לעבודה עם Messages. public class CustomListView - זו המחלקה שבה אני ממש את אירוע ה- Scroll בעזרת Messages. אני בעצם דורס את המטודה WndProc, ומוסיף קוד משלי שעושה בדיקות על ה- Message שהגיע ומפעיל את האירוע Scroll בהתאם. כרגע האירוע מבוסס על Notification מסוג LVN_ENDSCROLL שהפקד שולח כאשר המשתמש גורם ישירות לשינוי ערך פס הגלילה. הבעיה היא שהמקרים העקיפים לא מטופלים. למשל אם לעבור על רשימה עם המקלדת, למרות שערך פס הגלילה משתנה, ה- Message המדובר לא נשלח. כנ"ל אם מבצעים בחירה מרובה על פריטים שחלקם לא נמצאים בטווח הראיה בעזרת העכבר וגורמים לערך פס הגלילה להשתנות. אשמח לשמוע אם יש רעיונות איך להשלים את הקוד שיהיה תקף גם עבור המקרים שציינתי. זה הקוד:
אשמח לקבל תשובה.
שלום רב אני מתכנת בשפת C# בסביבת Visual Studio 2005. אני זקוק לאירוע Scroll של ListView שאני אדע מתי ערך פס הגלילה של הפקד משתנה. נדהמתי לגלות שבפקד לא ממומש אירוע כזה באופן מובנה. אחרי חיפושים אינסופיים באינטרנט ולמידת הנושא לעומק, הבנתי שצריך לממש את האירוע בעצמי. הכוונה היא לכתוב מחלקה חדשה שיורשת מ- ListView, להגדיר בה delegate ו- event של Scroll ולממש קוד שיפעיל את האירוע כשצריך. עם זאת עדיין לא הצלחתי להגיע לתוצאה מושלמת. הסברים על הקוד: namespace Win32 - מכיל הגדרות שנלקחו מקובצי C++ לעבודה עם Messages. public class CustomListView - זו המחלקה שבה אני ממש את אירוע ה- Scroll בעזרת Messages. אני בעצם דורס את המטודה WndProc, ומוסיף קוד משלי שעושה בדיקות על ה- Message שהגיע ומפעיל את האירוע Scroll בהתאם. כרגע האירוע מבוסס על Notification מסוג LVN_ENDSCROLL שהפקד שולח כאשר המשתמש גורם ישירות לשינוי ערך פס הגלילה. הבעיה היא שהמקרים העקיפים לא מטופלים. למשל אם לעבור על רשימה עם המקלדת, למרות שערך פס הגלילה משתנה, ה- Message המדובר לא נשלח. כנ"ל אם מבצעים בחירה מרובה על פריטים שחלקם לא נמצאים בטווח הראיה בעזרת העכבר וגורמים לערך פס הגלילה להשתנות. אשמח לשמוע אם יש רעיונות איך להשלים את הקוד שיהיה תקף גם עבור המקרים שציינתי. זה הקוד:
using System; using System.Runtime.InteropServices; namespace Win32 { [StructLayout(LayoutKind.Sequential)] struct NMHDR { public IntPtr hwndFrom; public int idFrom; public int code; } public enum WM { WM_USER = 0x0400, WM_NOTIFY = 0x004E } public enum OCM { OCM__BASE = WM.WM_USER + 0x1C00, OCM_NOTIFY = OCM__BASE + WM.WM_NOTIFY } public enum LVN { LVN_FIRST = -100, //0U-100U LVN_ITEMCHANGED = LVN_FIRST - 1, LVN_ENDSCROLL = LVN_FIRST - 81 } } using System; using System.Collections.Generic; using System.Windows.Forms; using System.Runtime.InteropServices; using Win32; namespace CLV { public class CustomListView : ListView { public delegate void ScrollDelegate(object sender); public event ScrollDelegate Scroll; protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == (int)OCM.OCM_NOTIFY && m.LParam != IntPtr.Zero) { NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); if (nmhdr.code == (int)LVN.LVN_ENDSCROLL || nmhdr.code == (int)LVN.LVN_ITEMCHANGED) { OnScroll(); } } } protected void OnScroll() { Scroll.Invoke(this); } } }
אם הגעתם עד לפה תודה רבה