-
-
Severity Code Description Project File Line Suppression State Error CS0120 An object reference is required for the non-static field, method, or property 'Form1.TextBoxCmd' SearchByTime C:\Users\uri\source\repos\SearchByTime\SearchByTime\Form1.cs 76 Active
-
@אוריי בשפה מונחית עצמים כמו C# יש מושג של מחלקה, ויש מופע.
מחלקה היא כמו תבנית עוגה, והמופע היא כמו העוגה. למחלקה אחת יכול להיות מופעים רבים.נניח ישנה מחלקה כזאת:
class MyExample { public int Name {get; set; } }
אם תנסה לכתוב בקוד MyExample.Name תקבל שגיאה (An object reference is required for the non-static field, method, or property 'Name'), כי זו רק התבנית, אתה חייב ליצור מופע ככה:
MyExample mofa = new MyExample(); Console.WriteLine(mofa.Name);
אבל, יש תבניות שיש להם כן חברים (שם כולל למאפיינים פונקציות וכל מה שיכול להיות במחלקה) משל עצמם ללא מופע, וממילא כן ניתן לגשת למאפיין ישירות. החברים האלו צריכים להיות מסומנים עם הציון static כלומר הערך אינו דינמי ומשתנה פר מופע, אלא אחיד לכל המופעים - הוא חלק מהתבנית.
אתה ניגש לTextBoxCmd שהוא חבר במחלקה Form1. אבל הוא לא סטטי, כלומר הוא קיים רק אם תיצור מהמחלקה את העוגה, כלומר תעשה new.
(מעניין שכתבת form1 באותיות קטנות וזה לא עשה לך שגיאה, לכאורה אם זה משתנה קיים אז זה צריך לעבוד לגמרי ואם זה לא זה צריך להיכשל עם שגיאה של מציין לא מוכר). -
לאחר שקראתי היום את כל הפוסטים מליל שישי שמתי לב שחסר לי הסבר בשאלה ויתרה מזו אפי' טעות ...
אז אני יכתוב שוב את השאלה מחדש ומפורט יותר כדי שיהיה יותר ברור- הטעות שלי הייתה במשמעות המילה אובייקט כאשר אני חשבתי שמדובר בשם כולל לחלקים מסויימים בטופס שאר הגולשים הבינו שמדובר במשתנה והצדק איתם (אי הבנה שלי במשמעות המילה נכון ע"כ זה סיבך את כולם כולל אותי [אע"פ שבזכות זה למדתי דברים חדשים ])
- ולגופו של שאלה
יש לי טופס בפרוייקט winForms ששמוForm1
בתוך הטופס יש לי תיבת טקסט בשםTextBoxCmd
.
בתוך הclass יש לי פונקציה סטטית שממנה אני רוצה לטפל בתיבת טקסט (לכתוב טקסט ולמחוק וכו') אמנם שאני ניגש לתיבת טקסט באופן הבא אני מקבל את השגיאה הבאה.
זה הפונקציה
public static void Shortcut(FileInfo file) { TextBoxCmd.Text = file.FullName; }
וזו השגיאה
Severity Code Description Project File Line Suppression State Error CS0120 An object reference is required for the non-static field, method, or property 'Form1.TextBoxCmd' SearchByTime C:\Users\uri\source\repos\SearchByTime\SearchByTime\Form1.cs 76 Active
וזה הclass המלא כעצת @Aharon-0
public partial class Form1 : Form { FolderBrowserDialog fbd; //DateTime DMin; //DateTime DMax; public Form1() { InitializeComponent(); } private void DateTimePicker1_ValueChanged(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { } private void Label1_Click(object sender, EventArgs e) { } private void SelectAFolder_Click(object sender, EventArgs e) { using (fbd = new FolderBrowserDialog()) { DialogResult result = fbd.ShowDialog(); if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath)) { TextPath.Text = fbd.SelectedPath; } } } private void Search_Click(object sender, EventArgs e) { var all = new DirectoryInfo(fbd.SelectedPath).EnumerateFiles("*", new EnumerationOptions { RecurseSubdirectories = true }); foreach (var file in all) Shortcut(file); } private void TextBoxCmd_TextChanged(object sender, EventArgs e) { } /// <summary> /// פונקצית פעולות על כל קובץ /// </summary> public static void Shortcut(FileInfo file) { Form1.TextBoxCmd.Text = file.FullName; } }
אני מקווה שעתה זה כתוב יותר ברור
-
@אוריי במקרה שלנו, המחלקה קוראים לה Form1.
כמה Form1 יש באפליקציה שבנית? אם מדברים מבחינת מחלקות, יש רק אחת.
אבל אם מדברים על מופעים, כלומר כמה פעמים אפשר לעשות new Form1? כמה שרוצים, בין אפס לאין סוף, כלומר אפשר הרבה מופעים לאותה מחלקה.
במחלקה Form1 עצמה בפונקציה לא סטטית, כשאתה כותב TextBoxCmd אז זה מתייחס לTextBoxCmd של המופע הנוכחי (this). אבל פונקציה סטטית אינה תלויה במופע, ואין לה מושג "מופע נוכחי" ולכן היא לא יודעת לאיזה TextBoxCmd לפנות, הרי יכול להיות אלף כאלו.כל זה לתיאוריה, אני יודע שאתה עוד לא כ"כ שמה. בעולם המעשי עליך למחוק את המילה static שנתקעה בפונקציה Shortcut והכל יבוא על מקומו בשלום (הפונקציה תפסיק להיות סטטית והיא תהיה פר מופע, תלויה במופע הנוכחי).
-