programing

기본 데이터 소스를 업데이트 할 때 DataGridView를 새로 고치는 가장 좋은 방법

nicescript 2021. 1. 14. 08:07
반응형

기본 데이터 소스를 업데이트 할 때 DataGridView를 새로 고치는 가장 좋은 방법


기본 데이터 원본을 업데이트 할 때 DataGridView를 새로 고치는 가장 좋은 방법은 무엇입니까?

저는 데이터 소스를 자주 업데이트하고 있으며 결과를 사용자에게 표시하고 싶었습니다.

나는 이것과 같은 것을 가지고 있지만 (작동합니다), null'ing DataGridView.DataSource은 올바른 방법처럼 보이지 않습니다.

List<ItemState> itemStates = new List<ItemState>();
dataGridView1.DataSource = itemStates;

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}

글쎄, 그것보다 훨씬 나아지지는 않습니다. 공식적으로는

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;

여전히 "클리어 / 리셋 소스"종류의 솔루션이지만 DGV 데이터 소스를 안정적으로 새로 고칠 수있는 다른 항목을 아직 찾지 못했습니다.


나는 이것을 직접 만났다. 내 추천 : 데이터 소스의 소유권이있는 경우 List를 사용하지 마십시오 . BindingList를 사용하십시오 . 는 바인딩은 그 항목이 추가되거나 변경하고 있습니다 화재 사건이 DataGridView에이 이러한 이벤트가 발사 될 때 자동으로 업데이트됩니다.


이 경우 가장 깨끗하고 효율적이며 패러다임 친화적 인 솔루션 System.Windows.Forms.BindingSource은 항목 목록 (데이터 소스)과 다음 사이의 프록시로 를 사용하는 것입니다 DataGridView.

var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;

그런 다음 항목을 추가 할 때 목록의 방법 대신 Add()방법을 BindingSource사용하십시오 Add().

for (var i = 0; i < 10; i++)
{
    bindingSource1.Add(new ItemState { Id = i.ToString() });
    System.Threading.Thread.Sleep(500);
}

이렇게하면 목록에 항목을 DataGridView추가하고 동일한 코드 줄로 해당 추가 사항에 대해 알릴 수 있습니다. 재설정 할 필요가 DataGridView의 않습니다 DataSource당신이 목록을 변경 할 때마다.

또한 BindingSourceVisual Studio의 Forms Designer에서 직접 양식에를 드롭하고 DataGridView거기에 데이터 소스로 첨부 할 수도 있습니다. 이렇게하면 수동으로 수행하는 위의 예제에서 코드 한 줄을 절약 할 수 있습니다.


Observablecollection : 항목이 추가, 제거되거나 전체 목록이 새로 고쳐질 때 알림을 제공하는 동적 데이터 컬렉션을 나타냅니다. IEnumerable 인터페이스를 구현하는 모든 컬렉션을 열거 할 수 있습니다. 그러나 컬렉션의 삽입 또는 삭제가 UI를 자동으로 업데이트하도록 동적 바인딩을 설정하려면 컬렉션에서 INotifyCollectionChanged 인터페이스를 구현해야합니다. 이 인터페이스는 내부 컬렉션이 변경 될 때마다 발생해야하는 이벤트 인 CollectionChanged 이벤트를 노출합니다.

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>();

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
  }
 dataGridView1.DataSource = itemStates;

이것은에서 내 대답을 복사입니다 곳.

다음과 같이 데이터 그리드를 다시 채울 필요가 있습니다.

this.XXXTableAdapter.Fill(this.DataSet.XXX);

dataGridView에서 자동 연결을 사용하는 경우이 코드는 Form_Load ()에서 자동으로 생성됩니다.


루프 내부에 데이터 소스를 설정하고 각 추가 후 500을 휴면합니다. 항목 상태에 추가 한 다음 모든 항목을 추가 한 후 데이터 소스를 설정하는 것이 어떻습니까? 그 후 실을 자고 싶다면. 여기서 첫 번째 코드 블록은 내가 수정 한 두 번째 블록입니다.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}

다음과 같이 코드를 변경하십시오. 이것은 훨씬 빠릅니다.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });

}
    dataGridView1.DataSource = typeof(List); 
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);

이 코드 시도

List itemStates = new List();

for (int i = 0; i < 10; i++)
{ 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = itemStates;
    dataGridView1.DataBind();
    System.Threading.Thread.Sleep(500);
}

참조 URL : https://stackoverflow.com/questions/253843/best-way-to-refresh-datagridview-when-you-update-the-base-data-source

반응형