기본 데이터 소스를 업데이트 할 때 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
당신이 목록을 변경 할 때마다.
또한 BindingSource
Visual 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);
}
'programing' 카테고리의 다른 글
Visual Studio 2013을 사용하여 관리 코드를 디버깅 할 수 없음 ( "식을 평가할 수 없음"오류-디버그 빌드 사용 중) (VS 2012가 작동 함) (0) | 2021.01.14 |
---|---|
플렉스 랩은 align-self, align-items 및 align-content와 어떻게 작동합니까? (0) | 2021.01.14 |
이메일을 받고 웹 애플리케이션에서 처리하는 방법 (0) | 2021.01.14 |
새로운 Number () 대 Number () (0) | 2021.01.14 |
조건부 빌더 메서드 체인 Fluent 인터페이스 (0) | 2021.01.14 |