1

DataGridView (Windows Forms) 사용자 컨트롤에있는 MultiSelect를 사용하도록 설정 한 상태에서 작업하고 있습니다. 여러 행을 선택하면DataGridView에서 여러 개의 선택된 INofityPropertyChange 개체 업데이트

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

불행하게도, 단 하나의 DataGridViewRow, 즉 하나의 즉시 새로 고침 : 나는 다음과 같은 코드를 구현하는 public 메소드를 호출하여 사용자 컨트롤 외부에서 선택된 모든 행을 업데이트 할 마지막으로 선택되었습니다. 기본 개체가 변경되고 NotifyPropertyChange-event가 발생합니다. 또한 업데이트 후 선택 항목을 변경하면 즉시 모든 행이 업데이트되도록 표시됩니다.

두 번째 사항, 매우 이상한 점 : NotifyPropertyChange가 발생하는 Rating-property의 Setter에 중단 점을 설정하고 코드 실행을 계속하기 전에 몇 초 기다리면 모든 것이 제대로 작동합니다 (모든 행이 즉시 업데이트 됨). 내가 기다리지 않고 중단 점이 지나갈 때마다 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 
} 

누군가가 이미 너무이 문제를 발견했습니다, 심지어는 솔루션 (또는 해결 방법을) 아는 사람?

답변

2

DGV가 일반 목록에 바인딩되어있는 경우 현재 선택된 행에 대한 PropertyChanged 이벤트에 대해서만 구독합니다. 대신 BindingList를 사용하거나 변경된 각 항목에 대해 BindingSource.ResetItem (n)을 호출 해보십시오.

MSDN gives an example BindingList를 사용하고 또한 (무의미하게) ResetItem을 호출합니다. 예제를 가지고 놀면 ResetItem에 대한 호출을 제거하거나 BindingList를 Regualr List <으로 교체하면 의도 한대로 작동한다는 것을 알 수 있습니다.