سؤال

وأنا أعمل مع DataGridView (ويندوز النماذج) مع تحديد متعدد تمكين التي يتم وضعها في عنصر تحكم العضو. أود أن تحديث كافة الصفوف المحددة من خارج تحكم العضو بالدعوة طريقة العامة التي تنفذ التعليمات البرمجية التالية:

foreach(DataGridViewRow dr in dataGridView.SelectedRows)
{
    MyBusiness business = (MyBusiness)dr.DataBoundItem;
    business.Rating = 5;
}

للأسف، عندما يتم اختيار عدة صفوف، يتم تحديث DataGridViewRow واحد فقط على الفور، وهي تلك التي كانت آخر المحدد. يتم تغيير الأشياء الأساسية، ويتم تشغيل NotifyPropertyChange الحدث. وعلاوة على ذلك، عندما أقوم بتغيير اختيار بعد التحديث، أرى كل الصفوف تجديد تماما كما أود لها أن تكون على الفور.

والشيء الثاني، غريب جدا: عندما أضع نقطة توقف في اضعة من Rating الملكية حيث أطلقت NotifyPropertyChange والانتظار هناك لبضع ثوان قبل الاستمرار بتنفيذ التعليمات البرمجية، كل شيء يعمل بشكل جيد (يتم تحديث كافة الصفوف على الفور). إذا كنت لا تنتظر ولكن اضغط F5 بسرعة كبيرة في كل مرة يتم تمرير نقطة، وأحصل على أثر المذكورة أعلاه.

وبلدي كائن العمل يشبه هذا (تقصير كبير طبعا):

public class MyBusiness : INotifyPropertyChanged
{
    private int _rating;
    public int Rating
    {
        get { return _rating; }
        set
        {
            if(_rating != value)
            {
                _rating = value;
                NotifyPropertyChanged("Rating");
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

لقد لاحظ أي شخص بالفعل هذا السلوك أيضا، أو حتى يعرف الحل (أو الحل)؟

هل كانت مفيدة؟

المحلول

إذا لا بد DGV الخاص بك إلى قائمة العادية، فإنه يشترك فقط إلى الحدث PropertyChanged للصف المحدد حاليا. حاول استخدام BindingList بدلا من ذلك، أو يدعو BindingSource.ResetItem (ن) لكل بند يتغير.

MSDN يعطي مثالا الذي يستخدم BindingList وأيضا ( بلا هدف) يدعو ResetItem. لعب مع مثالهم، ويمكنك أن ترى أن إما إزالة الدعوة إلى ResetItem، أو استبدال BindingList مع قائمة ريجوالر <> سوف تعمل على النحو المنشود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top