c# DataGridView.AutoSizeColumnsMode 설정 성능 차이
DataGridView를 출력할 때 칼럼의 폭을 어떻게 할 건지는 DataGridViewAutoSizeColumnsMode를 설정하여 결정한다. 기본 값인 none으로 하면 기본 설정된 칼럼의 폭으로 출력되며 셀에 출력될 문자열이 이 폭을 벗어나면 벗어난 부분은 잘린다. fill로 하면 DataGridView 크기만큼 꽉 차게 출력되며 각 칼럼에 비율을 설정하여 칼럼별로 폭을 다르게 할 수 있다. 이거로 설정을 하면 수직 스크롤바가 필요 없을 때에는 꽉 차게 나오다가 행들이 많아져서 위아래로 스크롤을 해야 하게 되면 저절로 폭이 줄며 스크롤바가 생겨서 편하다. AllCells로 하면 가장 문자열이 많은 셀에 맞게 폭이 결정되는데 칼럼(들)의 폭이 DataGridView의 폭보다 넓어지면 수평 스크롤바가 자동으로 생긴다. 일반적으로 DataGridView의 크기는 정해져 있는데 칼럼(들)의 폭이 수시로 변하면 보기 좋지 않으므로 이 설정은 잘 하지 않는다. 그러나 칼럼이 하나일 때에는 유용한다. DisplayedCells는 모든 셀들을 대상으로 하지 않고 현재 보이는 셀들의 폭들만 기준으로 하여 칼럼의 폭이 결정된다.
DataGridViewAutoSizeColumnsMode를 어떻게 설정하냐에 따라 출력되는 시간이 조금 달라진다. 아래 예제는 설정에 따른 차이를 확인하기 위한 건데 테스트를 해 보니 AllCells만 조금 더 걸리고 다른 셋들은 비슷했다. 워밍 업 테스트를 제외한 다섯 번씩의 평균이 none은 82,335,054, fill은 82,335,054, AllCells는 96,462,230, DisplayedCells는 82,426,428이었다. 이렇게 보면 별 차이 없어 보이지만 칼럼들과 행들이 많아지면 AllCells로 설정한 경우 많이 느려질 수 있다. 레퍼런스에도 각 설정에 따른 성능 저하에 대해 특별한 경고는 없다.
DataTable DataTable1 = new();
Random Random1 = new();
private void Form1_Load(object sender, EventArgs e)
{
DataTable1.Columns.Add();
dataGridView1.DataSource = DataTable1;
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
DataTable1.Clear();
Stopwatch stopwatch = new();
stopwatch.Start();
for (int i = 0; i < 5000; i++)
{
DataTable1.Rows.Add(Random1.Next().ToString());
}
textBox1.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n");
}
private void button2_Click(object sender, EventArgs e)
{
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
DataTable1.Clear();
Stopwatch stopwatch = new();
stopwatch.Start();
for (int i = 0; i < 5000; i++)
{
DataTable1.Rows.Add(Random1.Next().ToString());
}
textBox2.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n");
}
private void button3_Click(object sender, EventArgs e)
{
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DataTable1.Clear();
Stopwatch stopwatch = new();
stopwatch.Start();
for (int i = 0; i < 5000; i++)
{
DataTable1.Rows.Add(Random1.Next().ToString());
}
textBox3.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n");
}
private void button4_Click(object sender, EventArgs e)
{
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
DataTable1.Clear();
Stopwatch stopwatch = new();
stopwatch.Start();
for (int i = 0; i < 5000; i++)
{
DataTable1.Rows.Add(Random1.Next().ToString());
}
textBox4.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n");
}