-
בקצרה:
איך ניתן לאתחל את הפקד dateTimePicker - שלא ישלח שום נתוןובהרחבה:
יש לי שרשרת ייצור המכילה חמישה תהליכים
אני מעוניין לעקוב ברמה תאריכית על ביצוע כל שלבפלטפורמה: - #WinForms / C (ישן ארכאי / ובכ"ז....)
שמתמשקת ל: SQLבניתי שאילתה:
המכילה חמישה פקדים של dateTimePicker - שכל אחד מהם אמור לעדכן שלב נוסף במסד הנתונים.
בעת לחיצה על לחצן 'עדכן'
נשלח עדכון ערך הפקדים למסד נתונים
היות שלעיתים קרובות אני מעדכן שתים/שלוש שלבים בבת אחת
בניתי את זה כעדכון אחד לכל השדות ולא דרך המאפיין dateTimePicker1_ValueChanged של כל פקד
הבעיה שלי היא: שהפקד שולח לי תמיד את התאריך הנוכחי/ברירת מחדל - ומעדכן לי שדה מעוניין שתשאר בערך null
אני מעוניין שכל פקד שלא אגע / אבחר בו תאריך (נוכחי/קודם) - יישאר בו הערך nullאשמח לעזרתכם
-
@mekev צריך לראות קוד של טעינה מהמסד ושל איסוף הנתונים לפני העדכון.
לא הבנתי לגמרי את ה"כל אחד מהם אמור לעדכן שלב נוסף במסד הנתונים" ואת ה"בניתי את זה כעדכון אחד לכל השדות", אבל ייתכן שאחרי שתשתפו את הקוד יהיה מובן יותר.
(לדעתי לא יהיה פתרון קסם אלא קוד בדיקה מותאם, אבל עדיין אפשר לעשות את זה אלגנטי).עריכה: יש להבחין בין ערך מקורי של המסד לבין ערך מקורי של הפקד (בברירת מחדל אני רואה שזה תאריך נוכחי). בשביל לדעת בכלל אם הייתה התערבות משתמש נראה לי שקביעת ערך המאפיין
Checked = false
יכולה לעזור לקבוע אם המשתמש בחר תאריך (אמור להפוך כנראה לtrue). -
@dovid
זה הקוד שכתבתיstring oo = dataGridView2.CurrentRow.Cells["מזהה"].Value.ToString(); DateTime x1 = dateTimePicker1.Value; DateTime x2 = dateTimePicker2.Value; DateTime x3 = dateTimePicker3.Value; DateTime x4 = dateTimePicker4.Value; DateTime x5 = dateTimePicker5.Value; string y1 = x1.ToString("yyyy-MM-dd"); string y2 = x2.ToString("yyyy-MM-dd"); string y3 = x3.ToString("yyyy-MM-dd"); string y4 = x4.ToString("yyyy-MM-dd"); string y5 = x5.ToString("yyyy-MM-dd"); con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = $"UPDATE tabel SET תאריך 1 = '{y1}', תאריך 2 = '{y2}',תאריך 3 = '{y3}',תאריך 4 = '{y4}',תאריך 5 = '{y5}' WHERE מזהה = " + oo + ""; cmd.ExecuteNonQuery(); con.Close();
-
@mekev תגדירו את כל הפקדים שהמאפיין Checked שלהם יהיה false, ותעדכנו את הקוד לככה:
string id = dataGridView2.CurrentRow.Cells["מזהה"].Value; var y1 = dateTimePicker1.Checked ? dateTimePicker1.Value.ToString("yyyy-MM-dd") : null; var y2 = dateTimePicker1.Checked ? dateTimePicker2.Value.ToString("yyyy-MM-dd") : null; var y3 = dateTimePicker1.Checked ? dateTimePicker3.Value.ToString("yyyy-MM-dd") : null; var y4 = dateTimePicker1.Checked ? dateTimePicker4.Value.ToString("yyyy-MM-dd") : null; var y5 = dateTimePicker1.Checked ? dateTimePicker5.Value.ToString("yyyy-MM-dd") : null; con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = $"UPDATE tabel SET תאריך 1 = '{y1:yyyy-mm-dd}', תאריך 2 = '{y2}',תאריך 3 = '{y3}',תאריך 4 = '{y4}',תאריך 5 = '{y5}' WHERE מזהה = " + id + ""; cmd.ExecuteNonQuery(); con.Close();
שיניתי עוד קצת דברים בקוד.
למען הידע, אפשר את הToString להטמיע ישר בהשתלה של המחרוזות ככה:'{y1:yyyy-mm-dd}'
-
@dovid
היי שלום אני כאן חדש אבל יש לי הרבה נסיון בC#
מה שאתה צריך לעשות זה מאוד פשוט.
צריך לשונת את הפומט של הDateTimePircr שיוכל לגם לקבל פורמט מותאם אישית ז"א שיהיה אפשר לאתחל את הTIME בכל סוג של פורמט. ואז פשוט להגדיר את הזמן ל " "dateTimePicker1.Format=DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = " ";
את הקוד הזה לשים בתוך הform_load לכל control
וזה בעצם מאתחל את picker k" "מקווה שהסברתי את עצמי טוב.
אם יש שאלה הינך מוזמן לשאול כאן -
@יהושע אמר ב#dateTimePicker - C:
@dovid
היי שלום אני כאן חדש אבל יש לי הרבה נסיון בC#שלום עליכם @יהושע,
מקווה שתהנה ותתרום הרבה לפורום
יש לך טעות קטנה, האיש שתייגת (@dovid) הוא לא השואל פה. ואגב, גם לו יש המון נסיון ב-#C
(חוץ מזה, נראה שהשואל כבר קיבל תשובה מספיקה) -
@יהושע הפתרון שלך לא עונה על השאלה.
הקוד הבא ממחיש את הבעיה:var dateTimePicker1 = new DateTimePicker(); dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = " "; Console.WriteLine(dateTimePicker1.Value); //RESULT: 06/05/2021 19:35:27
השואל/ת רצה שכל עוד המשתמש לא ביצע בחירת תאריך, התוצאה תהיה null ולא שום תאריך.
-