עבור לתוכן

בעיה עם DataBinding ב- C#

Featured Replies

פורסם

נתקלתי בבעיה בשימוש ב- DataBinding ב- C#.

אני רוצה להשתמש ב- CurrencyManager על חלק מהשורות של טבלה מסוימת אז עשיתי ככה:

cm = (CurrencyManager)(BindingContext[foundRows]);
cm.Position = 0;

foundRows הוא מערך של DataRow.

לתוכו הכנסתי תוצאות של שאילתה שמחזירה תוצאות (בדקתי את זה) על ידי DataTable.Select().

שתי השורות האלה עובדות, והמצביע באמת מופנה לשורה הראשונה של התוצאות.

הבעיה היא שכאשר אני עושה Binding לתיבת טקסט:

textBox1.DataBindings.Add("Text", foundRows, "id");

ב- run זה מחזיר את השגיאה הזאת:

אין אפשרות לאגד אל המאפיין או העמודה id ב- DataSource.

שם פרמטר: dataMember

יש לציין שניסיתי לכתוב את השורה הזאת מעל ומתחת שתי השורות הקודמות, וגם שאם אני נותן ל- Binding שם של טבלה (DataTable) זה כן עובד.

אני באמת לא מבין מה הטעות שלי, איך זה יכול להיות שה- CurrencyManager מסוגל לעבוד עם מערך שורות וה- DataBinding לא?

פורסם

אני לא מכיר את זה יותר מדי טוב, אבל לדעתי יש בעיה עם ה-dataMember בתוך ה-dataRow.

הוא לא ממש יודע להתייחס לזה - גם ה-CurrencyManager לא יודע לעבוד עם זה ככה.

אם תכתוב:

cm = (CurrencyManager)this.BindingContext[foundRows, "id"];

אז הוא ייתן לך את אותה השגיאה בדיוק.

בלי "id" זה עובד כי הוא לא מחפש בתוך השורה כלום.

כנראה של-dataRow לא מוגדרים dataMember-ים אז הקישור לא יכול להתבצע... אם ייצא לי אני אבדוק את זה קצת יותר לעומק...

עריכה - למה אגב לא לעבוד עם dataSet כמו שצריך במקום dataRow?

פורסם
  • מחבר

אם תכתוב:

cm = (CurrencyManager)this.BindingContext[foundRows, "id"];

אז הוא ייתן לך את אותה השגיאה בדיוק.

בלי "id" זה עובד כי הוא לא מחפש בתוך השורה כלום.

כשאני כותב את השורה הזאת זה נותן לי בכלל שגיאה אחרת כי פה בכלל לא צריך dataMember, במקרה של ה- Binding כן צריך.

כנראה של-dataRow לא מוגדרים dataMember-ים אז הקישור לא יכול להתבצע

ל- DataRow כן מוגדרים dataMembers כי עובדה שהשורה הזאת עובדת:

textBox1.Text = ((DataRow)(cm.Current))["id"].ToString();

למה אגב לא לעבוד עם dataSet כמו שצריך במקום dataRow?

כי הכנתי שאילתה והפעלתי אותה על ידי הפעולה DataTable.Select() שמחזירה משתנה מסוג DataRow[].

פורסם

קודם כל ככה נראית ההגדרה:


public BindingManagerBase this[object dataSource] { get; }
public BindingManagerBase this[object dataSource, string dataMember] { get; }

הוא לא 'צריך', אבל אפשר לתת לו, וכשנותנים לו אז הוא לא עובד. כשלא נותנים לו הוא מחפש דברים אחרים ואז אולי הוא יכול לעבוד.

דבר שני, העובדה שהשורה הבאה


textBox1.Text = ((DataRow)(cm.Current))["id"].ToString();

עובדת בכלל לא קשורה לעניין. אתה לוקח את האובייקט הנוכחי של ה-CM וממיר אותו ל-DataRow. הסטרינג שהוא מצפה לו בסוגריים המרובעים הוא שם של dataColumun. וזה יש ל-dataRow. תסתכל בהגדרה של כל ה-overloads של סוגריים מרובעים ל-datarow ותראה שאף אחד מהם לא מקבל סטרינג dataMember אלא רק סטרינג columnName -


public object this[DataColumn column] { get; set; }
public object this[int columnIndex] { get; set; }
public object this[string columnName] { get; set; }
public object this[DataColumn column, DataRowVersion version] { get; }
public object this[int columnIndex, DataRowVersion version] { get; }
public object this[string columnName, DataRowVersion version] { get; }

בקיצור עדיין אין שום עדות לכך שלDataRow אפשר לתת DataMember בכלל.

כמה מסובכת השאילתה שלך? אולי כדאי לעשות את זה עם DataView ולהגדיר RowFilter.

dataview יעבוד לך בוודאות עם הtextbox-.

פורסם
  • מחבר

השאילתה היא פשוט מספר תנאים (משתנה בין 1 ל- 15).

אתה מוכן להרחיב בקשר לשימוש ב- DataView ו- RowFilter?

פורסם

דוגמא פשוטה (ומפגרת קצת):

DataTable dataTable = new DataTable("table");

dataTable.Columns.Add("id", typeof(int));
dataTable.Columns.Add("name", typeof(string));

dataTable.Rows.Add(new object[] { 11, "firstName" });
dataTable.Rows.Add(new object[] { 22, "middleName" });
dataTable.Rows.Add(new object[] { 33, "lastName"});
dataTable.Rows.Add(new object[] { 33, "lastNameAgain" });

DataView dataView = new DataView(dataTable);
dataView.RowFilter = "name = 'lastNameAgain' AND id = 33";

textBox1.DataBindings.Add("Text", dataView, "name");

אתה יוצר DataView שמכיל קישור לכל הטבלה שלך, ומגדיר לו RowFilter שמסנן לך מה 'להציג' (מה שמחליף את ה-Select). הוא משמש כ-DataSource לכל דבר ונוח לעבוד מולו.

אתה יכול לשנות דינמית את ה-RowFilter וה-dataview מתעדכן ככה שלא צריך ליצור אחד חדש כל פעם.

פה יש לך מידע על הסינטקס של הפילטר, הוא מאד חזק, אפשר לעשות דרכו חישובים ועוד כל מיני דברים מעניינים, שווה קריאה -

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

בהצלחה!

פורסם
  • מחבר

יופי, זה עובד!

תודה רבה על העזרה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים