עבור לתוכן

c# DATASET & DATAGRID

Featured Replies

פורסם

שלום :)

יש לי טבלה במסד נתונים שקישרתי אותה ל dataset ומשם ל datagrid.

אני מציג את הטבלה בחלון הראשי של הFORM שלי ואני רוצה שכל פעם שאני מכניס שורה חדשה למסד נתונים - הטבלה תתעדכן.

הבעיה שלי היא:

הגדרתי משתנים גלובלים לחיבורים ול DATASET.

בפעם הראשונה שאני קורא לפונקציה (לפני שהכנסתי משהו חדש, ישר עם הפעלת התוכנה) הכל עובד טוב ואני רואה את הטבלה במסד נתונים.

הכנסתי משהו חדש למסד נתונים, אני קורא לה שוב ואני מקבל שגיאה:

Cross-thread operation not valid: Control '_dbView' accessed from a thread other than the thread it was created on.

עכשיו, זאת פעם ראשונה שלי עם dataset אז אני כנראה עושה פה משהו לא נכון, אם זה באיך שאני מכניס, איך שאני מעדכן.. לא יודע מה.

יש אולי משהו יותר יעיל? משהו שיעקב כל הזמן אחרי המסד נתונים ויעדכן שינויים לבד בלי שאני אקרא כל פעם לפונקציה שתקרא את כל הטבלה מהמסד נתונים (נראה לי לא יעיל) ורק תבצע את העדכונים?

אני יכול להוסיף לDATAGRID כל פעם את השורה החדשה שהוספתי במקום להתחבר למסד נתונים אבל אם עשיתי שינוי בשורה אחרת הייתי רוצה שהיא גם תתעדכן (או שאולי יש אפשרות לבדוק אם היא נמצאת במסד נתנים ולעדכן גם שם וגם בטבלה במקביל וככה לחסוך עוד קריאה?)

הנה הקוד של הפונקציה

** da, sCon מוגדרים מחוץ לפונקציה, משתנים "גלובלים".





private void updateDataGrid()
{
using (sCon = new SqlConnection("Data Source=" + SettingsForm.getAddress + ";Initial Catalog=" + SettingsForm.getDatabase + ";Integrated Security=False;User Id=" + SettingsForm.getUser + ";Password=" + SettingsForm.getPassword + ";Connect Timeout=0;"))
{
sCon.Open();
string sqlCommand = "select top 200 * FROM cstPackages order by _dateTime desc"; //reading the db from end to start
using(da = new SqlDataAdapter(sqlCommand, sCon))
{
da.Fill(dbDataSet,"cstPackages");
BindingSource dbBind = new BindingSource(dbDataSet, "cstPackages");
_dbView.DataSource = dbBind;
sCon.Close();
}
}
}

תודה מראש לעוזרים :)

פורסם
  • מחבר

הסתדרתי בסוף.

יש לי בתוכנית גם SerialPort ויש לו Event Handler שכשמתקבלים נתונים.. מסתבר שזה רץ בתרד נפרד ולכן כשמנסים לגשת מהתרד הזה לGUI אז יש בעיה.

קצת קריאה והסתכלות בדוגמאות של מיקרוסופט ושימוש ב invoke עזרו לי לפתור את הבעיה.

http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

ארכיון

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

דיונים חדשים