עבור לתוכן

C#| העברת מידע בין forms

Featured Replies

פורסם

בניתי ספר כתובות עם c#.הוא בנוי בצורה שיש labels מעל listboxes ובתוך ה listbox יש את השם, הכתובת, מס' טלפון וכו' (לכל אחד יש listbox נפרד). למעלה יש כפתור "Add Person" שמה שהוא עושה זה לפתוח form חדש עם textboxes שבהם מכניסים את הפרטים. את כל הפרטים הוא שומר בקובץ xml.

ועכשיו לשאלה:

איך אני עושה שאחרי שב form השני לוחצים "add" כדי להוסיף איש לספר כתובות זה יוסיף אותו ואת הפרטים ב listboxes ב form הראשי?

נערך על-ידי ofersto

פורסם

תערוך בבקשה את הכותרת כך שתכיל את תמצית השאלה (כותרת לדוגמה: "העברת מידע בין טפסים ב-#C").

Form הוא מחלקה לכל דבר. אתה יכול להוסיף לו שדות ופונקציות כמו כל מחלקה אחרת, ולהגדיר אותם כ-public וככה לאפשר גישה אליהם ממחלקות אחרות.

אתה פשוט צריך להגדיר בטופס השני מתודה (או property, או כמה מתודות, מה שנוח לך) שתחזיר את הפרטים שהמשתמש הכניס, או להיפך - להגדיר בטופס הראשון מתודה שאומרת לו להוסיף את פרטי משתמש כלשהו לרשימה, ואז הטופס השני יקרא למתודה הזו.

נערך על-ידי שניצל

פורסם
  • מחבר
תערוך בבקשה את הכותרת כך שתכיל את תמצית השאלה (כותרת לדוגמה: "העברת מידע בין טפסים ב-#C").

Form הוא מחלקה לכל דבר. אתה יכול להוסיף לו שדות ופונקציות כמו כל מחלקה אחרת, ולהגדיר אותם כ-public וככה לאפשר גישה אליהם ממחלקות אחרות.

אתה פשוט צריך להגדיר בטופס השני מתודה (או property, או כמה מתודות, מה שנוח לך) שתחזיר את הפרטים שהמשתמש הכניס, או להיפך - להגדיר בטופס הראשון מתודה שאומרת לו להוסיף את פרטי משתמש כלשהו לרשימה, ואז הטופס השני יקרא למתודה הזו.

לא הבנתי. אני די מתחיל ב C#.

לעשות באחד ה Forms:


public void addPerson(){
listbox1.Items.Add(textbox1.Text);
}

?

נערך על-ידי ofersto

פורסם

ה-listbox שאתה רוצה להוסיף אליו את הנתון נמצא בטופס הראשון, וה-textbox שממנו אתה רוצה לקחת את הנתון נמצא בטופס השני. אז קוד כזה לא יכול לעבוד.

אתה צריך שהמתודה addPerson תקבל את הנתון מבחוץ (כפרמטר למתודה) ואז תוסיף אותו ל-listbox.

מצד שני אתה צריך שהטופס השני יקרא ל-addPerson, ויעביר לו את ה-textbox1.Text כפרמטר.

יש מבין?

פורסם
  • מחבר

יש מבין?

לא

אתה יכול לכתוב קוד מדגים?

נערך על-ידי ofersto

פורסם

באופן כללי מאוד, בטופס הראשון צריך להיות משהו כזה:

public void addPerson(string name) {
listbox1.Items.Add(name);
}

ואז בטופס השני צריך לבצע משהו כזה:

form1.addPerson(textbox1.Text);

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

פורסם
  • מחבר

ניסיתי משהו כזה ב Form1:


public void addPerson(string name, string address, string telephone, string email, string cellphone)
{
listBox1.Items.Add(name);
listBox2.Items.Add(address);
listBox3.Items.Add(telephone);
listBox4.Items.Add(email);
listBox5.Items.Add(cellphone);
}

ואת זה ב Form2:


Form1 f = new Form1();
f.addPerson(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text);

וזה לא עובד

פורסם

כמעט.

ה-f שהגדרת פה הוא לא הטופס הראשון, אלא הוא אובייקט חדש מאותו טיפוס של הטופס הראשון. אתה צריך לדאוג להעביר את הטופס הראשון בעצמו לטופס השני. כמו שאמרתי, אתה יכול לעשות את זה ע"י כך שתגדיר בקונסטקרטור של Form2 שיקבל פרמטר מטיפוס Form1, ואז כש-Form1 יוצר את ה-Form2 הוא יעבור לו את עצמו (this).

פורסם
  • מחבר
כמעט.

ה-f שהגדרת פה הוא לא הטופס הראשון, אלא הוא אובייקט חדש מאותו טיפוס של הטופס הראשון. אתה צריך לדאוג להעביר את הטופס הראשון בעצמו לטופס השני. כמו שאמרתי, אתה יכול לעשות את זה ע"י כך שתגדיר בקונסטקרטור של Form2 שיקבל פרמטר מטיפוס Form1, ואז כש-Form1 יוצר את ה-Form2 הוא יעבור לו את עצמו (this).

לא הבנתי... מה זה קונסטקרטור?

פורסם

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

הנה קישור להסבר.

נערך על-ידי eido300

פורסם

אגב, אופציה קצת יותר יפה (בעיניי) היא האופציה הראשונה שהצעתי.

לשמור ב-Form2 שדה (או מספר שדות) פומבי שיחזיקו את הפרטים שהמשתמש הכניס, ואז לשלוף את הפרטים האלה בקוד של Form1 - בדומה ל-OpenFileDialog ששומר את שם הקובץ הנבחר בשדה בשם FileName.

פורסם
  • מחבר
אגב, אופציה קצת יותר יפה (בעיניי) היא האופציה הראשונה שהצעתי.

לשמור ב-Form2 שדה (או מספר שדות) פומבי שיחזיקו את הפרטים שהמשתמש הכניס, ואז לשלוף את הפרטים האלה בקוד של Form1 - בדומה ל-OpenFileDialog ששומר את שם הקובץ הנבחר בשדה בשם FileName.

לא מובן בעליל

פורסם

אז לא משנה. נראה לי שאתה צריך להמשיך ללמוד עוד קצת על #C ועל תכנות מונחה עצמים.

  • 2 שבועות מאוחר יותר...
פורסם

היי שניצל,

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

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

בכל מקרה כל הכבוד לך על התמיכה הקבועה באנשי הפורום.

פורסם

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

בשיטה השנייה אתה צודק, עדיף לעשות את זה עם אירועים. זה יותר מתאים למקרה שרוצים ששני הטפסים יהיו פעילים במקביל.

נערך על-ידי שניצל

ארכיון

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

דיונים חדשים