BindingSource on remove item event

3 באפריל 2012

תגיות: , , ,
אין תגובות


 


יצא לי לאחרונה להשתמש בפקד BindingSources ב – WindowsForms Application – תפקיד הפקד הוא לשמש מכניזם המאפשר לממש בקלות קישור בין אובייקטי המידע שלנו לבין פקדים בטופס.

 

אחד הדברים המעניינים (והמעצבנים) שגיליתי – הוא שאם אני רוצה לדעת מתי נמחק איבר כלשהו מהרשימה (נניח שקשרתי את ה – BindingSource ל – Grid, והמשתמש מוחק שורה מההגריד), ניתן להירשם לאירוע ListChanged כך:

 

 



Binder.ListChanged += binder_ListChanged;


 

ובמתודה לבדוק

 



private void binder_ListChanged(object sender, ListChangedEventArgs e)


{


    if (e.ListChangedType == ListChangedType.ItemDeleted)


    {


        //….


    }


}


 

 

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

 

 

לאחר שיטוט בגוגל, החלטתי לרשת מה – BindingSource ולהוסיף אירוע שיתרחש לפני מחיקת איבר, כך:

 



public class EventBindingSource : BindingSource


{


    public event EventHandler<CancelEventArgs<object>> ItemRemoving;


 


    public EventBindingSource()


    {


 


    }


 


    public EventBindingSource(IContainer container)


        : base(container)


    {


 


    }


 


    public EventBindingSource(object dataSource, string dataMember)


        : base(dataSource, dataMember)


    {


 


    }


 


    public override void Remove(object value)


    {


        if (EnsureRemoving(value))


            base.Remove(value);


    }


 


    public override void RemoveAt(int index)


    {


        object value = this[index];


 


        if (EnsureRemoving(value))


            base.RemoveAt(index);


    }


 


    private bool EnsureRemoving(object value)


    {


        CancelEventArgs<object> cea = new CancelEventArgs<object>(value);


        OnItemRemoving(cea);


 


        return !cea.Cancel;


    }


 


    protected virtual void OnItemRemoving(CancelEventArgs<object> e)


    {


        if (ItemRemoving != null)


        {


            ItemRemoving(this, e);


        }


    }


}


 

הגדרתי ארוע שמקבל CancalEventArgs<T (זהו הרחבה של מה שמתואר כאן) – הנה הקוד שלו

 



public class CancelEventArgs<T> : CancelEventArgs


{


    public T Data { get; private set; }


 


    public CancelEventArgs(T data)


    {


        Data = data;


    }


}


 

לפני מחיקה של איבר מהרשימה, נודיע לכל מי שנרשם שאיבר הולך להימחק – במידה ואף אחד לא ביטל את המחיקה, אכן נמחק את האיבר (בעזרת קריאה ל – base).

 

כמובן שעכשיו כל מי שרוצה לדעת מה נמחק יוכל.

 

ניתן להרחיב את המחלקה על ידי הגדרת אירוע בשם ItemRemoved ולשלוח את המידע למי שמעוניין לדעת מה נמחק רק לאחר המחיקה.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים