WPF לחצן שונה בראש שורה האחרונה בדטה-גריד
-
-
בד"כ אתה מעדיף קוד, אז אם יש לך DataGridRow מסויימת ביד (למשל באירוע לואדינג כמו שעשית בעבר) והיא נקראת dr תוכל לבדוק ככה:
If dr.Item = CollectionView.NewItemPlaceholder Then dr.HeaderTemplate = XXX End If
פורסם במקור בפורום CODE613 ב26/12/2013 18:48 (+02:00)
-
תודה רבה,
עשיתי כעצתך כך:Private Sub RowHeadBtn_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Dim btn As Button = DirectCast(e.Source, Button) Dim DC = DirectCast(DirectCast(btn.TemplatedParent, ContentPresenter).Parent, StackPanel).DataContext If DC Is CollectionView.NewItemPlaceholder Then btn.Content = "*" End If End Sub
וזה עובד מצויין, אבל יש בעיה:
יש גליון נתונים ראשי של אנשי קשר, בראש כל שורה של איש קשר יש לחצן עם '+' אני לוחץ עליו ונפתח לי גליון משני שמציג את ההזמנות של איש קשר זה, שהרי יש קשר גומלין בין שני טבלאות אלו, במקביל אני פותח את הגליון הראשי של ההזמנות, כעת אני חוזר לגליון המשני של ההזמנות הנמצא תחת שורה מסויימת באנשי קשר, ומוסיף עבור איש קשר זה הזמנה, באותו רגע גם בגליון הראשי של ההזמנות מתווספת שורה חדשה על שם אותו איש קשר, אלא שהלחצן שבראש אותה שורה נשאר עם כוכבית במקום לההפך ל '+'.
צירפתי תמונה, חץ אדום מורה על שורת ההזמנה שבגליון המשנה, שורה זו נוספה ידנית, החץ הירוק מורה על השורה החדשה שנוספה אוטומטית בגליון הראשי של ההזמנות ורואים שהלחצן שבראש השורה עם כוכבית ולא הפך ל '+'פורסם במקור בפורום CODE613 ב26/12/2013 19:32 (+02:00)
-
העיקר זה לפתור את הבעיה, אבל אני גם שואל למה שם הארוע לא גורם ללחצן שבראש השורה לשנות את הטקסט שלו.
@דוד ל.ט.אגב אני תמה למה במקומו הוא (בפרטי איש קשר) הוא השתנה אחרי שהוספת.
הארוע RowHeadBtn_Loaded מטפל בטעינה של הלחצן שבראש השורה ולא בטעינת ה RowDetails ולכן כל פעם שאני מוסיף שורה חדשה ויש צורך ביצירת לחצן חדש עבור ראש השורה החדשה הארוע הזה קופץ, אבל משום מה בגליון הראשי של ההזמנות זה לא עובד.
פורסם במקור בפורום CODE613 ב26/12/2013 19:54 (+02:00)
-
העיקר זה לפתור את הבעיה, אבל אני גם שואל למה שם הארוע לא גורם ללחצן שבראש השורה לשנות את הטקסט שלו.
@דוד ל.ט.
אגב אני תמה למה במקומו הוא (בפרטי איש קשר) הוא השתנה אחרי שהוספת.הארוע RowHeadBtn_Loaded מטפל בטעינה של הלחצן שבראש השורה ולא בטעינת ה RowDetails ולכן כל פעם שאני מוסיף שורה חדשה ויש צורך ביצירת לחצן חדש עבור ראש השורה החדשה הארוע הזה קופץ, אבל משום מה בגליון הראשי של ההזמנות זה לא עובד.
האירוע הזה קופץ כשהכפתור נוצר. זהו.
אתה יכול להסביר לי למה הוא נוצר אחרי שאתה ממלא שורה חדשה? הוא כבר היה שם לפני כן!
רק השורה הנוספת שנוצרת אח"כ מקפיצה אירוע לכפתורה המשוייך לה.פורסם במקור בפורום CODE613 ב26/12/2013 20:06 (+02:00)
-
אני חושב שכאשר אתה ממלא שורה חדשה אז השורה עם הכפתור עם הכוכבית קופץ קדימה, ואתה למעשה ממלא שורה שנוצרה באותו רגע, זה נדמה כאילו אתה מלאת את השורה האחרונה אבל למעשה השורה האחרונה קפצה לסוף ואתה מלאת שורה שנוצרה ברגע זה ממש ולכן גם הלחצן שלה יש לו '+' ולא כוכבית.
אין איזה טריגר לזה
פורסם במקור בפורום CODE613 ב26/12/2013 20:49 (+02:00)
-
אני חושב שכאשר אתה ממלא שורה חדשה אז השורה עם הכפתור עם הכוכבית קופץ קדימה, ואתה למעשה ממלא שורה שנוצרה באותו רגע, זה נדמה כאילו אתה מלאת את השורה האחרונה אבל למעשה השורה האחרונה קפצה לסוף ואתה מלאת שורה שנוצרה ברגע זה ממש ולכן גם הלחצן שלה יש לו '+' ולא כוכבית.
אתה לא צריך כ"כ להתחבט בנושא, זה קל לבדיקה.
שים ברייקפוינט ותראה מה מקור השינוי.
אני בדקתי הרגע: שמתי באירוע טעינה שישנה את הכיתוב לזמן דקות+שניות. בגמר מילוי שורה הזמן לא שונה, אלא הזמן של השורה שנוצרה למטה. כך שממש פלא בעיני שהוא מתהפך לך ל+ בלי שאתה סוגר ופותח אותו.אין איזה טריגר לזה
למה טריגר, אתה הולך עם קוד. ואם טריגר, אז עד הסוף, לא חצי קוד וחצי טריגר.
כל עוד אינך עולה על הבעיה זה לא פלא שאין לך פיתרון. אחרי שנודע שאני צודק (אם כי לא מיושבת העובדה שזה עובד לך לחצאין) אז האירוע שלך צריך להיות שורה חדשה/מס' שורות השתנה וכדומה.פורסם במקור בפורום CODE613 ב26/12/2013 21:13 (+02:00)
-
@דוד ל.ט.
למה טריגר, אתה הולך עם קוד. ואם טריגר, אז עד הסוף, לא חצי קוד וחצי טריגר.
אפשר לכותב טריגר גם בתוך הקוד, שכל כל XAML אפשר לתרגם לקוד.
@דוד ל.ט.
שמתי באירוע טעינה שישנה את הכיתוב לזמן דקות+שניות.
שמת בטעינה של הלחצן? או בטעינה של ה RowDetails ?
פורסם במקור בפורום CODE613 ב26/12/2013 21:42 (+02:00)
-
@דוד ל.ט.
למה טריגר, אתה הולך עם קוד. ואם טריגר, אז עד הסוף, לא חצי קוד וחצי טריגר.אפשר לכותב טריגר גם בתוך הקוד, שכל כל XAML אפשר לתרגם לקוד.
מקוה שהבנת אותי אף על פי כן.
@דוד ל.ט.
שמתי באירוע טעינה שישנה את הכיתוב לזמן דקות+שניות.שמת בטעינה של הלחצן? או בטעינה של ה RowDetails ?
אכן בטעינת לחצן.
פורסם במקור בפורום CODE613 ב26/12/2013 22:09 (+02:00)
-
@דוד ל.ט.
אז האירוע שלך צריך להיות שורה חדשה/מס' שורות השתנה וכדומה.
איך נקרא ארוע כזה בדטה-גריד? מה שאני יודע על הוספת שורות זה ארוע CollectionChanged עבור ObservableCollection אבל ארוע זה קופץ מיד איך שהאוסף משתנה עוד לפני שהדטה-גריד מוסיף שורה.
פורסם במקור בפורום CODE613 ב27/12/2013 08:49 (+02:00)
-
אתה צודק.
אני חוזר בי ממה שכתבתי.
כעת בבדיקה שלי מתברר לי בדיוק כמו שכתבת: שאכן בעת כניסה לעריכת שורה חדשה נוצרת שורה של ממש והחדשה נעלמת עד סיום העריכה או הביטול.
אבל! רק השורה מתחדשת והויזואל נשאר אותם אלמנטים. ממילא צריך באירוע השורה ללכוד,
ולכן הקוד הזה עובד כן טוב:Private Sub dg_LoadingRow(sender As Object, e As DataGridRowEventArgs) If e.Row.Item.Equals(CollectionView.NewItemPlaceholder) Then e.Row.Header = "*" Else e.Row.Header = "+" End If End Sub
ממילא תעשה כך, רק במקום שינוי תוכן הכותרת הצב שם טמפלט מתאימה.
פורסם במקור בפורום CODE613 ב31/12/2013 21:10 (+02:00)