אנא העלה את הXAML ו/או קוד רלוונטי.
פורסם במקור בפורום CODE613 ב24/12/2013 17:11 (+02:00)
אנא העלה את הXAML ו/או קוד רלוונטי.
פורסם במקור בפורום CODE613 ב24/12/2013 17:11 (+02:00)
איך הגדרת את הItemSource, למערך?
אם כן נסה במקום זאת לשים בו List גנרי (עם סוגריים והמילה Of).
פורסם במקור בפורום CODE613 ב24/12/2013 16:49 (+02:00)
IsEditable = True
אם אני זוכר טוב.
הקישור שלך זה סינון לא רק השלמה, בד"כ לא רוצים/צריכים את זה.
פורסם במקור בפורום CODE613 ב24/12/2013 11:58 (+02:00)
רק עכשיו קלטתי שהפונקציה של magicode היא ממספר לטקסט.
זה מה שארכיטקט רצה?
פורסם במקור בפורום CODE613 ב24/12/2013 12:43 (+02:00)
גם אני התכוונתי אליהם,
אם אתה מתכוון לזה שהוא שרשר במקום לכתוב ברצף הוא יכל לכתוב "הי" במקום שרשור, וכן למה ב"יו" יש בעיה.
פורסם במקור בפורום CODE613 ב23/12/2013 23:09 (+02:00)
[ואפי' הקפדת על שם השם שלא יופיע אפי' שזה רק על המסך.]
לא בגלל ההקפדה אלא בשביל לא לקבל תוצאה שגוייה.
פורסם במקור בפורום CODE613 ב23/12/2013 22:24 (+02:00)
למה המתודות בקוד האחרון מוגדרות לאובייקט במקום מחרוזת או תו?
פורסם במקור בפורום CODE613 ב23/12/2013 21:05 (+02:00)
ברור שאתה לא צריך להשתמש בשתי אוספים, ממש לא חשבתי להציע לך דבר כה "גאוני"...
כתבתי לך קולקשיין ויו (CollectionView).
זה לא אוסף בכלל, זה כמו "חלון" לאוסף.
אין לו עצמיות מבחינת התוכן, אלא מבחינת התצוגה (מיון, סינון, ניווט).
תראה דוגמאות על זה.
פורסם במקור בפורום CODE613 ב23/12/2013 13:06 (+02:00)
זה בגלל שאתה משתף פקד DataGrid לאותו מקור נתונים.
הפקד DataGrid מוסיף אלמנט לרשימה שמאפשר להוסיף שורה חדשה.
תשתמש בשתי קולקשיין ויו.
פורסם במקור בפורום CODE613 ב23/12/2013 12:02 (+02:00)
אין הבדל בין קניית דומיין ל"תפיסתו".
וזה לא כולל אירוח אתר, אם לא שילמת על זה בפירוש.
המחיר משתנה בין הTop-Doamin: למשל co.il יקר יחסית, com בינוני, וnet זול. יש עוד יותר זולים (כל מיני ארצות נשכחות) ואפי' חינמיים מידי פעם.
טווח המחיר הוא בד"כ 50 ש"ח+- לשנתיים.
פורסם במקור בפורום CODE613 ב22/12/2013 19:42 (+02:00)
תודה על המחמאות.
הבעיה זה לא כמות השאלות, שהפורום צמא לכאלו, אלא שצריך לייחד אשכול לכל נושא.
פורסם במקור בפורום CODE613 ב25/12/2013 19:50 (+02:00)
תודה רבה זה מצויין,
יש לי שתי שאלות לגבי הלחצן שבראש השורה:
איך אפשר להגדיר שאם הלחצן בשורה האחרונה של הדטה-גריד שבכפתור יהיה כתוב '*' במקום '+' כיון שזו שורה שמיועדת ליצירת שורה חדשה ולא שייך לפתוח שם גליון משנה.
איך אפשר לעשות שהלחצן עם ה '+' ישאר תמיד למעלה וכמו שכבר שאלתי באשכול אחר, ולא ירד תמיד לאמצע.
לגבי טפלט שונה לכל שורה בשביל ה RowDetailsTemplate, זה הרבה יותר מורכב, כיון שב RowDetailsTemplate אני צריך לדחוף גליון נתונים שזה פקד שלם שמקבל בבנאי שלו פרמטר של "טבלה גנארית OF TRecord" וגם צריך להגדיר שהגליון הזה הוא משנה ולא ראשי ולפי איזה ID הוא יציג את השורות.
אבל ישתבח שמו מצאתי פתרון בשיטה כזו:
בתוך ה XAML הגדרתי שה RowDetailsTemplate יהיה רק גריד פשוט, ואז בארוע LoadingRowDetails יצרתי מופע של פקד חדש של הגליון נתונים עם כל מה שהוא צריך ואז הוספתי את הפקד לילדים של הגריד הנ''ל, למדתי את זה מכאן.
בקשר לשאלות, עליך כמדומני לשנות את כותרת האשכול ל"איך פותרים את כל הבעיות שיש לי בWPF במהלך הימים הללו" :lol: , וברצינות: אין שום קשר בין השאלות.
בקשר ל"מורכבות העצומה" (מה שתיארת זה מקרה קלאסי של שתי תבניות לרשימה אחת) של הפירוט, אני שמח שהסתדרת :).
פורסם במקור בפורום CODE613 ב25/12/2013 19:01 (+02:00)
כעת לעניין טמפלטים משתנים כל שורה לפי X.
בWPF יש DataTemplateSelector. שזה מחלקה שמחזירה DataTemplate לפי הטיפוס שהיא מקבלת.
הדרכה קצרה:
א. יוצרים טמפלטים לכל סיטואציה במקטע הResource של החלון (הסעיף הזה הוא לא מוכרח רק זה נח וככה עושים בד"כ).
<DataTemplate x:Key="NormalTemplate">
<TextBlock Text="{Binding FirstName}" />
</DataTemplate>
<DataTemplate x:Key="VipTemplate">
<StackPanel>
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
</DataTemplate>
ב. יוצרים קלאס שיורשת מDataTemplateSelector, ודורסים את מתודת SelectTemplate שם משתמשים עם הפרמטר item לבדוק מה להחזיר
Class SelectTempletByRow
Inherits DataTemplateSelector
Shared win As MainWindow = Application.Current.MainWindow
Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
If CType(item, Person).LastName = "דוד ל.ט." Then
Return win.FindResource("VipTemplate")
Else
Return win.FindResource("NormalTemplate")
End If
End Function
End Class
כעת מוסיפים למקטע הריסורס של החלון את הלאסס שעשינו:
<local:SelectTempletByRow x:Key="Selector" />
ומגדירים את המאפיין RowDetailsTemplateSelector של הDataGrid:
RowDetailsTemplateSelector="{StaticResource Selector}"
קצת מסובך אבל זה עקרונות מתקדמים ונחוצים בWPF, שווה!
בהצלחה.
פורסם במקור בפורום CODE613 ב25/12/2013 18:23 (+02:00)
לא הבנתי את הבעיה בקשר לשורה שהראית, זה אמור לעבוד.
הקטע עם התבנית והבנאי, מאוד מעורפל.
אבל אם כבר אראה לך איך עושים בצורה זאמלית את העסק.
קודם הקטע עם ה+-:
<DataGrid.RowHeaderTemplate >
<DataTemplate>
<ToggleButton x:Name="btn" IsChecked="{Binding DetailsVisibility, Converter={StaticResource VisToBool}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}" >
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}" >
<Setter Property="Content" Value="+" />
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="-" />
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
הקוד הזה עושה שימוש בקונוורטר. Converter זה משהו מאוד שימויש, במקרה של איגוד בין דברים "לא קשורים", כגון בין צבע למספר וכו'.
הוא נעשה ע"י מופע של קלאס כלשהיא שמממשת את IValueConverter.
הדרך ליצירת מופעים בxaml הוא פשוט להצהיר על קיומם, ובשביל זה גם צריך לייבא את הNamespace של הפרוייקט הנוכחי משהו כמו:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfStyle""
x:Class="MainWindow" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:VisToBool x:Key="VisToBool"/>
</Window.Resources>
בשורה 4 מבוצע ייבוא ניימספייס לפרוייקט הנוכחי.
בשורה 7 נוצר מופע של קונוורטר.
הנה הקוד של הקלאס VisToBool:
Class VisToBool
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
Return CType(value, Visibility) = Visibility.Visible
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
Return If(CBool(value) = True, Visibility.Visible, Visibility.Collapsed)
End Function
End Class
פורסם במקור בפורום CODE613 ב25/12/2013 18:02 (+02:00)
בWPF מקובל מאוד לא לעשות כמו שהראית, ממילא זה גם מסובך לגמרי.
מה שמקובל זה בינדינג בין הכפתור לנראות של הפירוט.
זה מסובך קצת, כי הכפתור חסר מצב, אז צריך להשתמש בToggleButton.
כמו"כ מוכרחים קונוורטר מבולאני לויסיבליטי.
זה נראה פי כמה מסובך ממה שאמור להיות, אבל מנסיון, זה הרבה יותר נוח ומסודר לטווח ארוך.
אם יהיה לי זמן, מחר אעלה את קוד שעושה זאת.
פורסם במקור בפורום CODE613 ב22/12/2013 21:06 (+02:00)
במה שכתבתי אודות הקונסטרקטור הסטטי הייתה לי טעות, במקום _id צריך לכתוב שמה (פעמיים בהודעה) inc.
פורסם במקור בפורום CODE613 ב23/12/2013 19:46 (+02:00)
תהיה בריא.
לא ניסיתי לשכנע, שים לב.
פורסם במקור בפורום CODE613 ב23/12/2013 14:18 (+02:00)
@דוד ל.ט.
לבעיה שכתבת אתה צריך לקבוע את _id (לפי מקור נתוניך) מתוך קונסטרקטור סטטי:אולי זה מה שאתה מתכוון אבל אני הגדרתי שהמאפיין ID הוא לא לקריאה לבד, ואז כאשר אני קורה מהדיסק את הנתונים אני נותן ערך ל ID של כל רשומה ורשומה כמו שהיה לה בריצה הראשונה, ורק בדטה גריד אם אני מציג את העמודה של ה ID היא לקריאה בלבד.
לא הבנתי אותך. אני התייחסתי בכל אופן לקוד שהעלתי לעיל. לא אמורה להיות בעיה גם אם המאפיין הוא לקריאה בלבד, כי השדה הפנימי הוא פתוח לכתיבה.
אנא נסה לא להיות עוד כטוען בחיטים ומודה בשעורים... זה הרי ברור כשמש שלא התכוונתי למה שעשית (שדרך אגב, זה מצויין לגמרי, רק שעדיף למנוע שינוי בטעות אף בתוך הקוד מחוץ למחלקה).
@דוד ל.ט.
אבל זה ממש לא פיתרון טוב עבור מסד נתונים, מכמה וכמה סיבות.תוכל לפרט בבקשה אני חייב לדעת.
אתה בטוח שאתה חייב לדעת? מה אם אומר לך שאיני יודע? הנושא הזה הוא יכול להילמד כמה שנים באוניברסיטה. אבל לא בשביל כל מסקנה אני חייב לדעת את ה"הוכחה" כתובה, ואני חושב שגם אתה לא חייב.
דומני שאתה יכול לשער בנפשך שלא נבראו מסדי נתונים רק בשביל מתכנתים עצלנים באופן יוצא מן הכלל, אלא לעוד כמה סיבות טובות.
אם אתה רוצה משל: חשוב מה קורה שאתה מפעיל את התוכנה פעמיים ומעדכן בשניהם. זה בעיונת טפשונת שניתנת לפיתרון קל, אבל עוד כמה כאלה ואתה מגיע למסקנתי.
@דוד ל.ט.
אם זה ממש מסד, אל תטפל במספור אוטומטי, בשביל מה לך.אני חייב שיהיה לי מזהה יחודי לכל רשומה בטבלה
אם זה כדי שלכל אלמנט יהיה זיהוי, אתה יכול להשתמש בשמו.
אלא איך אפשר אחרת?
@רחמים
כך שזה מסד לכל דבר רק בלא SQL ובלא דטה-סיט ובלא אקסס.
פורסם במקור בפורום CODE613 ב23/12/2013 11:31 (+02:00)
נ.ב
צריך לתקן בקוד במקום Return ID
Return _id
נכון, התבלבלתי.
לבעיה שכתבת אתה צריך לקבוע את _id (לפי מקור נתוניך) מתוך קונסטרקטור סטטי:
Shared Sub New()
'read file from disk
'and set _id = max + 1
End Sub
אבל זה ממש לא פיתרון טוב עבור מסד נתונים, מכמה וכמה סיבות.
אם זה ממש מסד, אל תטפל במספור אוטומטי, בשביל מה לך.
פורסם במקור בפורום CODE613 ב22/12/2013 20:39 (+02:00)
תוסיף לאובייקט שלך (כמו האנשי קשר) שדה סטטי שיספור איפה אוחזים.
בבנאי תקצה את המספר הפנוי. ככה:
Shared inc As Integer
Dim _id As Integer
Public ReadOnly Property ID
Get
Return ID
End Get
End Property
Public Sub New()
_id = inc
inc += 1
End Sub
פורסם במקור בפורום CODE613 ב19/12/2013 22:19 (+02:00)