c# DataGridView.DataSource 바인드 뒤 칼럼 속성 유지하기
DataGridView가 기본으로 설정되어 있는 상태에서는 칼럼의 헤더를 가운데로 얼라인해도 헤더 텍스트는 한가운데에 출력되지 않고 왼쪽으로 쏠려 나온다. 칼럼은 기본적으로 쏘트를 할 수 있게 설정되어 있다. 칼럼 헤더를 클릭하여 쏘트를 하게 되면 헤더의 오른쪽에 삼각형의 아이콘이 만들어지는데 이게 출력될 자리가 확보되어 있다. 따라서 칼럼 헤더를 한가운데에 나오게 하려면 쏘트 기능을 못 쓰게 설정해야 한다.
아래는 쏘트 기능을 끄고 DataTable을 DataGridView에 연결하는 예제인데 원하는 결과는 나오지 않는다.
private void button1_Click(object sender, EventArgs e)
{
DataTable dataTable = new();
dataTable.Columns.Add("int");
dataTable.Columns.Add("string");
dataTable.Rows.Add(1, "a");
foreach (DataGridViewColumn item in dataGridView1.Columns)
{
item.SortMode = DataGridViewColumnSortMode.NotSortable;
}
dataGridView1.DataSource = dataTable;
}
DataSource에 연결이 되기 전에는 칼럼이 없기 때문이다. 원하는 결과를 얻으려면 아래와 같이 바인드를 한 뒤 칼럼 속성을 수정해야 한다.
private void button2_Click(object sender, EventArgs e)
{
DataTable dataTable = new();
dataTable.Columns.Add("int");
dataTable.Columns.Add("string");
dataTable.Rows.Add(1, "a");
dataGridView1.DataSource = dataTable;
foreach (DataGridViewColumn item in dataGridView1.Columns)
{
item.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
간단하지만 문제가 있다. DataSource를 수시로 바꿔야 하는 경우도 있기 때문이다. 그렇다면 이럴 땐 DataSource를 바꾼 때마다 같은 속성을 반복해서 설정해야 할까? 아니다. 아래와 같이 칼럼을 먼저 만들어 두고 설정을 하면 그 뒤에는 같은 형태의 DataSource라면 다른 거로 바꾸어 연결해도 처음 설정한 속성이 유지된다.
private void button3_Click(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 2;
dataGridView1.Columns[0].Name = "int";
dataGridView1.Columns[0].DataPropertyName = "int";
dataGridView1.Columns[1].Name = "string";
dataGridView1.Columns[1].DataPropertyName = "string";
foreach (DataGridViewColumn item in dataGridView1.Columns)
{
item.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
DataPropertyName을 설정하지 않으면 연결되는 DataSource가 이미 만들어진 칼럼들의 오른쪽에 추가로 만들어지므로 DataPropertyName을 설정하여 DataSource가 찾아 들어갈 칼럼을 특정해 줘야 한다.