[c#] DataGridView 컨트롤의 열 크기를 자동으로 조정하고 사용자가 동일한 그리드의 열 크기를 조정할 수 있도록하는 방법은 무엇입니까?

Windows Form (WPF가 아닌 C # 2.0)에 DataGridView 컨트롤을 채우고 있습니다.

내 목표는 사용 가능한 모든 너비를 셀로 깔끔하게 채우는 그리드를 표시하는 것입니다. 즉, 오른쪽 아래에 사용되지 않는 (진한 회색) 영역이없고 포함 된 데이터에 따라 각 열의 크기를 적절하게 조정 하지만 사용자가 모든 열의 크기를 조정할 수 있습니다. 그들의 취향에.

그리드의 전체 영역이 데이터로 깔끔하게 채워지 도록 DataGridViewAutoSizeColumnMode.Fill 로 설정 한 열 중 하나를 제외하고 각 열의 AutoSizeMode를 DataGridViewAutoSizeColumnMode.AllCells 로 설정하여이를 달성하려고합니다 . (사용자가이 열의 크기를 조정하려고 시도 할 때 수평 공간이 항상 사용되도록하는 크기로 되돌아 간다는 점에 신경 쓰지 않습니다.)

그러나 앞서 언급했듯이로드되면 사용자가 자신의 요구 사항에 맞게 열의 크기를 조정할 수 있도록하고 싶습니다. 각 열에 대해 이러한 AutoSizeMode 값을 설정하면 사용자가 해당 열의 크기를 조정할 수없는 것처럼 보입니다.

크기 조정을 허용하는 모든 열의 AutoSizeMode를 설정하지 않았지만 셀에 포함 된 데이터에 따라 초기 크기를 설정하지 않았습니다. 데이터를로드 한 후 그리드의 AutoSizeMode를 다시 “설정되지 않음”으로 변경하면 동일한 결과가 발생합니다.

기본 열 너비 및 사용자 크기 조정의 자동 설정을 허용하는 여기에 누락 된 설정이 있습니까? 아니면 DataGridView 컨트롤을 채울 때 사용해야하는 다른 기술이 있습니까?



답변

이 트릭은 저에게 효과적입니다.

grd.DataSource = DT;

//set autosize mode
grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= grd.Columns.Count - 1; i++) {
    //store autosized widths
    int colw = grd.Columns[i].Width;
    //remove autosizing
    grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    //set width to calculated by autosize
    grd.Columns[i].Width = colw;
}

여기서 일어나는 일은 자동 크기를 필요한 모드로 설정 한 다음 자동 크기 계산에서 얻은 너비를 열별로 저장하고 자동 크기 조정을 제거하고 너비를 이전에 저장 한 값으로 설정하는 것입니다.


답변

전화 할 수 있을지도 몰라

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

데이터 소스 설정 후. 너비를 설정하고 크기를 조정할 수 있습니다.

MSDN DataGridView.AutoResizeColumns 메서드 (DataGridViewAutoSizeColumnsMode)에 대한 추가 정보 .


답변

Miroslav Zadravec 코드의 AC # 버전

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    int colw = dataGridView1.Columns[i].Width;
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dataGridView1.Columns[i].Width = colw;
}

다른 사람의 평판을 훼손하지 않도록 커뮤니티 위키로 게시


답변

내 응용 프로그램에서 설정했습니다.

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

또한, 나는

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;

이제 열 너비를 변경할 수 있으며 사용자가 열을 재정렬 할 수 있습니다. 그것은 나를 위해 꽤 잘 작동합니다.

아마도 그것은 당신을 위해 일할 것입니다.


답변

그리드에 데이터를 추가 한 후 각 셀의 데이터 길이에 따라 열을 조정하는 다음 코드를 추가합니다.

dataGrid1.AutoResizeColumns();
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

결과는 다음과 같습니다.

여기에 이미지 설명 입력


답변

글쎄, 나는 이것을 이렇게했다.

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;

그 특정 순서로. 열 크기가 조정 (확장)되고 사용자는 나중에 열 크기를 조정할 수 있습니다.


답변

질문을 올바르게 이해했다면 필요한 작업을 더 쉽게 수행 할 수있는 방법이있을 것입니다. 요구
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

그게 트릭을해야합니다. 그러나 DataGridView 컨트롤을 채운 후이 메서드를 직접 호출 할 수 없기 때문에 한 가지 함정이 있습니다. 대신 VisibleChanged 이벤트에 대한 EventHandler를 추가하고 거기에서 메서드를 호출해야합니다.