-
הגדרת הצורך:
ביצוע לחצן 'ריענון' למסך דוחות(תיאור: סביבת פיתוח C# - WINFORM
יש menuStrip של דוחות שונים, לפי טווח תאריכים שבוחר המשתמש
ואני מעוניין שכאשר נבחר טווח תאריכים חדש
המשתמש יכול ללחוץ על ה'רענון' והדוח יופק מחדש (במקום כיום שיש לבצע שוב בחירה בלשונית>תת לשונית)
)הגדרת (חוסר) ידע נוכחי:
לעבוד ארוך ועקום בצורה if>else וכו' לא מומלץ במקרה דנן
(חשבתי לחפש את הפונקציה האחרונה שרצה, אבל זה אינו נכון
כי עלול להתבצע בינתיים פונקציות אחרות באותו namespace במקום אחר)היות וC# זה שפה מונחת עצמים
הגיוני שאמור להיות דרך
להוסיף בכל Click הכנסה של שם הפונקציה הנוכחית (ToolStripMenuItem9_Click) ל'משתנה'/פונקציה
ובכל לחיצה על הלחצן ריענון, הוא יבצע את הפונקציה השמורהאשמח לעזרתכם
-
@mekev אמר בהכנסת פונקציה (private void) לX וגישה אליה בהמשך (לחצן לביצוע חוזר):
להוסיף בכל Click הכנסה של שם הפונקציה הנוכחית (ToolStripMenuItem9_Click) ל'משתנה'/פונקציה
ובכל לחיצה על הלחצן ריענון, הוא יבצע את הפונקציה השמורהלדעתי זו הדרך הפשוטה.
-
@mekev הטיפוס delegate הוא המתאים לפי הספר ולפי הOOP.
אבל זה מסורבל, ואפשר להשתמש בטיפוסים מסוג deleghate ישירות.
הטיפוסים הם:Action - עבור מתודת void עם 0 או יותר פרמטרים (למשל
Action<int, string>
זה עם שניים.
Func - עבור פונקציה שמחזירה ערך, ומקבלת 0 או יותר פרמטרים (הפרמטר הגנרי האחרון/היחיד הוא הטיפוס של הערך החוזר). דוגמה:Action lastAction = null; void ToolStripMenuItem9_Click(object sender, EventArg e){ lastAction = () => ToolStripMenuItem9_Click(sender, e); //... }
אבל אתה תצטרך לעשות את זה בכל מתודה, וזה לא dry בכלל.
לכן אתה צריך שכל הToolStripMenuItem יהיו עם אותה פונקציה מטפלת והיא תשלח לדוח המתאים בהתאם לשם של הsender וכדומה. במקרה הזה יהיה גם הרבה יותר פשוט לטפל במקרה של "ביצוע חוזר" כי אפשר לאחסן את השם של השולח האחרון במשתנה string פשוט ולהפעיל בדיוק באותו אופן של הפעם הראשונה אבל עם פרמטר של המשתנה הזה. -
@mekev חשבתי על משהו כזה:
public class ReportsStore { private Dictionary<string, Delegate> _reports = new Dictionary<string, Delegate>(); private string _lastInvoked = ""; public ReportsStore() { _reports["Sales"] = GenSalesReport; _reports["Clients"] = GenClientsReport; } public void Invoke(string name, params object?[]? args) { _lastInvoked = name; _reports[name].DynamicInvoke(args); } public void InvokeLast() { Invoke(_lastInvoked); } public void GenSalesReport(DateTime date) { // Do your stuff for this report Console.WriteLine($"Sales report for {date}"); } public void GenClientsReport(string clientName) { // Do stuff for this report Console.WriteLine($"Client report for {clientName}"); } } // Usage: ReportsStore reports = new ReportsStore(); reports.Invoke("Sales", DateTime.Now); reports.Invoke("Client", "Avraham");
-