문제

나는 함께 일하고있다 DataGridView (Windows Forms) 사용자 컨트롤에 배치 된 MultiSelect 활성화를 사용합니다. 다음 코드를 구현하는 공개 메소드를 호출하여 사용자 컨트롤 외부에서 선택한 모든 행을 업데이트하고 싶습니다.

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

불행히도 여러 행을 선택하면 하나만 DataGridViewRow 즉시 새로 고침, 즉 마지막으로 선택된 것입니다. 기본 객체가 변경되고 NotifyPropertyChange-Event가 발사됩니다. 또한 업데이트 후 선택을 변경하면 모든 행이 바로 원하는대로 정확하게 업데이트되는 것을 볼 수 있습니다.

두 번째로, 매우 이상한 : 세트의 세터에 중단 점을 설정했을 때 Rating-Property 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 (N)을 호출하여 변경되었습니다.

MSDN은 예를 제공합니다 Bindinglist를 사용하고 (무의미하게) ResetItem 호출을 사용합니다. 예제를 가지고 재생하면 재설정 호출을 제거하거나 바인딩리스트를 Regualr List <>로 바꾸는 것이 의도 한대로 작동하는 것을 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top