http://msdn.microsoft.com/ko-kr/library/system.windows.forms.datagridview.virtualmode.aspx
가상 모드는 매우 큰 데이터 저장소와 함께 사용할 수 있도록 디자인되었습니다. VirtualMode 속성이 true로 설정되면 지정된 수의 행 및 열을 가진 DataGridView를 만든 후 CellValueNeeded 이벤트를 처리하여 셀을 채울 수 있습니다. 가상 모드를 사용하려면 사용자의 동작을 기준으로 DataGridView 셀의 채우기, 편집 및 삭제를 처리하기 위한 내부 데이터 캐시를 구현해야 합니다. 가상 모드 구현에 대한 자세한 내용은 방법: Windows Forms DataGridView 컨트롤에서 가상 모드 구현을 참조하십시오.
DataGridView 컨트롤이 바인딩된 모드에 있는 경우 바인딩되지 않은 열의 값을 유지하려면 가상 모드를 사용해야 합니다. 바인딩된 모드에서는 바인딩되지 않은 열을 기준으로 정렬할 수 없습니다.
대용량 모드에서 스크롤시 데이터를 불러와서 DataGridView 컨트롤에 바인딩 해 줄 수 있습니다.
using System.IO;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System;
public class VirtualModeDemo : Form
{
DataGridView dataGridView1 = new DataGridView();
public VirtualModeDemo()
: base()
{
Text = "DataGridView virtual-mode demo (cell-level commit scope)";
dataGridView1.NewRowNeeded +=
new DataGridViewRowEventHandler(dataGridView1_NewRowNeeded);
dataGridView1.RowsAdded +=
new DataGridViewRowsAddedEventHandler(dataGridView1_RowsAdded);
dataGridView1.CellValidating +=
new DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
dataGridView1.CellValueNeeded +=
new DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);
dataGridView1.CellValuePushed +=
new DataGridViewCellValueEventHandler(dataGridView1_CellValuePushed);
Controls.Add(dataGridView1);
dataGridView1.VirtualMode = true;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Numbers", "Positive Numbers");
dataGridView1.Rows.AddCopies(0, initialSize);
}
bool newRowNeeded;
private void dataGridView1_NewRowNeeded(object sender,
DataGridViewRowEventArgs e)
{
newRowNeeded = true;
}
const int initialSize = 5000000;
int numberOfRows = initialSize;
private void dataGridView1_RowsAdded(object sender,
DataGridViewRowsAddedEventArgs e)
{
if (newRowNeeded)
{
newRowNeeded = false;
numberOfRows = numberOfRows + 1;
}
}
#region "data store maintance"
const int initialValue = -1;
private void dataGridView1_CellValueNeeded(object sender,
DataGridViewCellValueEventArgs e)
{
if (store.ContainsKey(e.RowIndex))
{
// Use the store if the e value has been modified
// and stored.
e.Value = store[e.RowIndex];
}
else if (newRowNeeded && e.RowIndex == numberOfRows)
{
if (dataGridView1.IsCurrentCellInEditMode)
{
e.Value = initialValue;
}
else
{
// Show a blank value if the cursor is just resting
// on the last row.
e.Value = String.Empty;
}
}
else
{
e.Value = e.RowIndex;
}
}
private void dataGridView1_CellValuePushed(object sender,
DataGridViewCellValueEventArgs e)
{
store.Add(e.RowIndex, int.Parse(e.Value.ToString()));
}
#endregion
private Dictionary<int, int> store = new Dictionary<int, int>();
private void dataGridView1_CellValidating(object sender,
DataGridViewCellValidatingEventArgs e)
{
dataGridView1.Rows[e.RowIndex].ErrorText = "";
int newInteger;
// Don't try to validate the 'new row' until finished
// editing since there
// is not any point in validating its initial value.
if (dataGridView1.Rows[e.RowIndex].IsNewRow) { return; }
if (!int.TryParse(e.FormattedValue.ToString(),
out newInteger) || newInteger < 0)
{
e.Cancel = true;
dataGridView1.Rows[e.RowIndex].ErrorText = "the value must be a non-negative integer";
}
}
[STAThreadAttribute()]
public static void Main()
{
Application.Run(new VirtualModeDemo());
}
}
'C#.NET' 카테고리의 다른 글
app.config 읽기 (0) | 2009.12.23 |
---|---|
초간단 .NET 날짜간격 구하기 (0) | 2009.12.15 |
[VS 2005,비주얼 스튜디오] 잘못된 바인딩 핸들입니다 (0) | 2009.12.15 |
[MSDN] Control.Invoke 메서드 (Delegate, Object[]) (0) | 2009.12.15 |
[암호화,MD5,SHA1] 비밀번호 암호화 하기 (0) | 2009.12.15 |
Windows Forms DataGridView 컨트롤에서 가상 모드 구현 (0) | 2009.12.11 |
[MSDN]제네릭 클래스(C# 프로그래밍 가이드) (0) | 2009.12.10 |
[web.Config &구성 검색] DB접속 연결자 등록해놓고 사용하기 (0) | 2009.12.08 |
[Using Data Contracts]wcf로 클래스 데이터 주고 받기 (0) | 2009.12.07 |
[Entity Framework]엔티티 프레임워크 데이터작업 (0) | 2009.12.03 |