מה אתה רוצה? כמו מה?
פורסם במקור בפורום CODE613 ב30/12/2013 15:47 (+02:00)
מה אתה רוצה? כמו מה?
פורסם במקור בפורום CODE613 ב30/12/2013 15:47 (+02:00)
כנראה המאפיין גובה בכלל לא משתנה אלא המאפיין ActualHeight.
אז תשנה בקוד לActualHeightProperty. נסה אם זה עובד.
פורסם במקור בפורום CODE613 ב31/12/2013 12:13 (+02:00)
בסדר גמור אתה, רק תשנה את השורות האלו:
Dim PropDis = DependencyPropertyDescriptor.FromProperty(DataGridRow.HeightProperty, GetType(DataGridRow))
PropDis.AddValueChanged(e.Row, AddressOf EventH)
אני מאוד מתלהב שאתה עובד לבד,
אבל אני פחות מתלהב מזה שאתה טס קדימה בלי לבדוק את הארכיטקטורה של WPF, ואת גישתה לבעיותיך.
בקצב העצמאות שלך, אתה יכול לוותר על WPF לטובת C++, ודוק
פורסם במקור בפורום CODE613 ב30/12/2013 16:11 (+02:00)
לא יודע.
פורסם במקור בפורום CODE613 ב30/12/2013 15:54 (+02:00)
כן.
ואם אתה ממש רוצה (ואני כבר מכיר אותך ככזה):
Dim PropDis = DependencyPropertyDescriptor.FromProperty(DataGridColumn.WidthProperty, GetType(DataGridColumn))
For Each col In DataGrid1.Columns
PropDis.AddValueChanged(col, AddressOf EventH)
Next
חתימת המתודה EventH :
Private Sub EventH(sender As Object, e As EventArgs)
פורסם במקור בפורום CODE613 ב30/12/2013 13:19 (+02:00)
אני חושב שאין אירוע, רק בינדינג.
פורסם במקור בפורום CODE613 ב30/12/2013 10:50 (+02:00)
נראה לי ככה:
RAISERROR ('הודעת שגיאה', 0,0);
ROLLBACK TRANSACTION;
פורסם במקור בפורום CODE613 ב30/12/2013 16:21 (+02:00)
אני כבר מתחיל לראות באופק את Northwind ב WPF בע''ה ...
northwind זה אפליקציה.
אתה בונה אפליקציה+מסד נתונים.
פורסם במקור בפורום CODE613 ב30/12/2013 10:37 (+02:00)
צודק. זה תלוי בך, אתה לא חייב לתפוש את החבל מכל הכיוונים. לא היית חייב לכתוב באינטרפייס את הפרופרטיז הללו, וגם להישאר עם הגנריות שלהם.
אני הייתי עושה הכל עם אינטרפייס ולפחות את האוספים, ככה:
Public Class Connection
Implements IConnection
Public Property MainCollectionOfTableIn As ObservableCollection(Of IRecord) Implements IConnection.MainCollectionOfTableIn
Public Property MainCollectionOfTableOut As ObservableCollection(Of IRecord) Implements IConnection.MainCollectionOfTableOut
End Class
Public Interface IConnection
Property MainCollectionOfTableOut As ObservableCollection(Of IRecord)
Property MainCollectionOfTableIn As ObservableCollection(Of IRecord)
End Interface
פורסם במקור בפורום CODE613 ב29/12/2013 18:46 (+02:00)
Public Class Connection(Of TRecordA As IRecord, TRecordB As IRecord)
Implements IConnection(Of TRecordA, TRecordB)
Public Property MainCollectionOfTableOut As ObservableCollection(Of TRecordA) Implements IConnection(Of TRecordA, TRecordB).MainCollectionOfTableOut
Public Property MainCollectionOfTableIn As ObservableCollection(Of TRecordB) Implements IConnection(Of TRecordA, TRecordB).MainCollectionOfTableIn
End Class
Public Interface IConnection(Of TRecordA As IRecord, TRecordB As IRecord)
Property MainCollectionOfTableOut As ObservableCollection(Of TRecordA)
Property MainCollectionOfTableIn As ObservableCollection(Of TRecordB)
End Interface
פורסם במקור בפורום CODE613 ב29/12/2013 17:52 (+02:00)
או: תעשה כמו שהצעתי וקונקשיין תחליף לObject.
או: כדי להשתמש בקונקשנים בלי קאסט צור ממשק לקונקשיין ככה:
Public Class GenaricTable(Of TRecord As IRecord)
Public WithEvents ConnectionsCollection As ObservableCollection(Of IConnection)
End Class
Public Class Connection(Of TRecordA As IRecord, TRecordB As IRecord)
Implements IConnection
Public Sub New(GenaricTableOut As GenaricTable(Of TRecordA), GenaricTableIn As GenaricTable(Of TRecordB))
End Sub
End Class
או: אתה יכול להחליט לעשות גם ככה:
Public Class GenaricTable(Of TRecord As IRecord)
Implements ITable
Public WithEvents ConnectionsCollection As ObservableCollection(Of Connection)
End Class
Public Class Connection
Public Sub New(GenaricTableOut As ITable, GenaricTableIn As ITable)
End Sub
End Class
פורסם במקור בפורום CODE613 ב29/12/2013 15:08 (+02:00)
אני מאוד לא מבין את הכיוון ואת הדרך, לא הבנתי גם למה במקום באובגקט אתה לא משתמש עם המחלקה היפה שעשית (GenaricTable).
כלומר המחלקה קונקשיין לפי איך שהתחלת אמורה להיראות ככה:
Public Class Connection(Of TRcordA, TRecordB)
Public Sub New(GenaricTableOut As GenaricTable(Of TRcordA), GenaricTableIn As GenaricTable(Of TRecordB))
End Sub
End Class
אבל אני מריח את הבעיה עליה אתה שואל.
אתה מנסה להתמודד מראש עם מחלקות שונות שיתנו פחות או יותר אותה פונקציונליות אבל עדיין מחלקות שונות.
אגב, בC#, אין אופציה בכלל למה שעשית. אם אתה לא יודע מראש את סוג המחלקה, אין לך שום אפשרות להשתמש במאפיין/מתודה שאת הבטוח שיהיה בה).
אז מה עושים? אז פה כדאי מאוד לסקור חזק את נושא ה"תכנות מונחה עצמים"', OOP בלועזית מרשימה.
בOOP יש שתי דברים שמאוד נוגעים לשאלתך:
א. Interface - ממשק (מנשק לפי האקדמיה :)) שזה עצם שמכיל רשימה של חוקים, שכל מחלקה שמכריזה על עצמה כמממשת את אותו Interface, חייבת לממש.
ב. מחלקת אב אבסטרקטית (מופשטת). בהנחה שאתה מכיר את המושג "ירושה", אז אפשר ליצור מחלקה למחצה (שאין לה שום טעם משל עצמה, וגם אי אפשר ליצור ממנה מופע), ותפקידה זה לתרום את הפונקציונליות שלה למחלקות היורשות ממנה.
שתי הדרכים נראים דומות אך יש הרבה הבדלים בינהם, הן באופן השימוש והן במטרתו.
במקרה שלך כדאי לך ליצור אב טיפוס, או ממשק או מחלקה מופשטת, ולוותר על השימוש בגנריות ולהשתמש בטיפוס מוגדר, מסוג אב.
באופן כללי ניתן לומר כלל שהשימוש בגנריות מומלץ א. מתי שלא פונים הרבה לאלמנטים בתוך האובייקט ב. מתי שמתכוננים לתת שירות גם לטיפוסים שלא תחת אחריותינו כלל.
פורסם במקור בפורום CODE613 ב29/12/2013 11:53 (+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)
@דוד ל.ט.
למה טריגר, אתה הולך עם קוד. ואם טריגר, אז עד הסוף, לא חצי קוד וחצי טריגר.אפשר לכותב טריגר גם בתוך הקוד, שכל כל XAML אפשר לתרגם לקוד.
מקוה שהבנת אותי אף על פי כן.
@דוד ל.ט.
שמתי באירוע טעינה שישנה את הכיתוב לזמן דקות+שניות.שמת בטעינה של הלחצן? או בטעינה של ה RowDetails ?
אכן בטעינת לחצן.
פורסם במקור בפורום CODE613 ב26/12/2013 22:09 (+02:00)
אני חושב שכאשר אתה ממלא שורה חדשה אז השורה עם הכפתור עם הכוכבית קופץ קדימה, ואתה למעשה ממלא שורה שנוצרה באותו רגע, זה נדמה כאילו אתה מלאת את השורה האחרונה אבל למעשה השורה האחרונה קפצה לסוף ואתה מלאת שורה שנוצרה ברגע זה ממש ולכן גם הלחצן שלה יש לו '+' ולא כוכבית.
אתה לא צריך כ"כ להתחבט בנושא, זה קל לבדיקה.
שים ברייקפוינט ותראה מה מקור השינוי.
אני בדקתי הרגע: שמתי באירוע טעינה שישנה את הכיתוב לזמן דקות+שניות. בגמר מילוי שורה הזמן לא שונה, אלא הזמן של השורה שנוצרה למטה. כך שממש פלא בעיני שהוא מתהפך לך ל+ בלי שאתה סוגר ופותח אותו.
אין איזה טריגר לזה
למה טריגר, אתה הולך עם קוד. ואם טריגר, אז עד הסוף, לא חצי קוד וחצי טריגר.
כל עוד אינך עולה על הבעיה זה לא פלא שאין לך פיתרון. אחרי שנודע שאני צודק (אם כי לא מיושבת העובדה שזה עובד לך לחצאין) אז האירוע שלך צריך להיות שורה חדשה/מס' שורות השתנה וכדומה.
פורסם במקור בפורום CODE613 ב26/12/2013 21:13 (+02:00)
העיקר זה לפתור את הבעיה, אבל אני גם שואל למה שם הארוע לא גורם ללחצן שבראש השורה לשנות את הטקסט שלו.
@דוד ל.ט.
אגב אני תמה למה במקומו הוא (בפרטי איש קשר) הוא השתנה אחרי שהוספת.הארוע RowHeadBtn_Loaded מטפל בטעינה של הלחצן שבראש השורה ולא בטעינת ה RowDetails ולכן כל פעם שאני מוסיף שורה חדשה ויש צורך ביצירת לחצן חדש עבור ראש השורה החדשה הארוע הזה קופץ, אבל משום מה בגליון הראשי של ההזמנות זה לא עובד.
האירוע הזה קופץ כשהכפתור נוצר. זהו.
אתה יכול להסביר לי למה הוא נוצר אחרי שאתה ממלא שורה חדשה? הוא כבר היה שם לפני כן!
רק השורה הנוספת שנוצרת אח"כ מקפיצה אירוע לכפתורה המשוייך לה.
פורסם במקור בפורום CODE613 ב26/12/2013 20:06 (+02:00)
אתה שואל גם למה, או רק שואל איך לפתור זאת?
אגב אני תמה למה במקומו הוא (בפרטי איש קשר) הוא השתנה אחרי שהוספת.
פורסם במקור בפורום CODE613 ב26/12/2013 19:44 (+02:00)
בד"כ אתה מעדיף קוד, אז אם יש לך DataGridRow מסויימת ביד (למשל באירוע לואדינג כמו שעשית בעבר) והיא נקראת dr תוכל לבדוק ככה:
If dr.Item = CollectionView.NewItemPlaceholder Then
dr.HeaderTemplate = XXX
End If
פורסם במקור בפורום CODE613 ב26/12/2013 18:48 (+02:00)
ארכיטקט, נראה לי שהבעיה היא הסיטואציה שלך, ולא מערכת הDB. למה? ממה שאני מבין בכל מקום, זה לא כ"כ מעניינו של הDB הדברים הללו.
הסיבה שאתה עושה את זה ברמת הDB זה משום שהקליינט שלך הוא אקסס, אבל סביר מאוד שבצורך נורמלי הכי טוב זה SP (יוזר, טבלה, עמודה, שדה חדש) שמכניס את הנתון ומעדכן את הלוג, וכל הבעיה נפתרה.
הסיבה שאני חושב שהDB הוא לא המקום לכאלה דברים, זה העובדה שאין את האפשרות הזאת בצורה פשוטה, ייתכן אמנם שפשוט כולם טפשים אבל בכל אופן.
פורסם במקור בפורום CODE613 ב26/01/2014 19:03 (+02:00)
יש אור בקצה המנהרה!!
אפשר להריץ SQL כמחרוזת כזה:EXECUTE ( 'select * from Contacts')
כעת צריך לראות אם אפשר ליצור מחרוזת גנרית שתיבנה על ידי קוד ושבעצם תהיה שאילתת עדכון ובא לציון גואל.
ברור שאפשר וזה ידעתי מתחילה רק שזה ממש לא נראה לי דרך נורמלית.
פורסם במקור בפורום CODE613 ב31/12/2013 19:16 (+02:00)