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가 찾아 들어갈 칼럼을 특정해 줘야 한다.