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


109

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

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

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

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

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

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


망가로 설정 "뿐만 세트"로 설정 "없음" resizement이 때문에 되돌릴 수 없습니다 C #을 테스트, .net2.0을 -
bh_earth0

답변:


132

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

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;
}

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


1
AutoResizeColumnWidthsYetAllowUserResizing이라는 루틴에 비슷한 코드를 넣었습니다. 그리드가 처음에 채워진 후 그리고 사용자가 데이터를 편집 한 후에 (즉, 그리드의 CellEndEdit 이벤트에서) 호출됩니다.
DeveloperDan

5
이것은 훌륭한 코드입니다. 'DataGridView1_DataSourceChanged'이벤트에 넣어야합니다.
user890332 2012

1
하는 grd.Columns(i).Width = grd.Columns(i).Width것이 이미 트릭 을 할 것 같습니다 . 를 참조하십시오 여기 .
Antonio

2
C #의 경우 비슷하지만 대괄호가 있습니다 dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
barlop

이것은 매우 늦었을 수도 있지만 혹시라도 특정 행의 내용에 따라 크기를 조정할 수 있습니까? 다른 행의 셀 너비에 관계없이 첫 번째 행의 셀 내용을 기반으로한다고 가정 해 보겠습니다.
Murtuza Husain

45

전화 할 수 있을지도 몰라

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

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

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


2
이 답변이 더 많은 관심을 끌지 못하는 이유를 모르겠습니다. 훨씬 더 깨끗합니다. 셀 내용 너비를 일치시키려는 경우 DataGridViewAutoSizeColumnsMode.AllCells가 조금 더 잘 작동합니다.
iwalkbarefoot

31
이 솔루션을 사용하면 다음 오류가 발생합니다. "autoSizeColumnMode 매개 변수가이 작업에 유효하지 않습니다. NotSet, None 또는 Fill이 될 수 없지만 크기 조정 기준을 표시해야합니다." . 이 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
itsho 2010 년

6
DataGridViewAutoSizeColumnMode.Fill을 사용하면 열 크기를 조정할 때 셀 내용을 무시하므로 작동하지 않습니다.
Stuart Helwig

이 방법을 DataGridViewAutoSizeColumnsMode.DisplayedCells. 또한 양식 디자이너에서 AutoSizeColumnsMode는 없음으로 설정됩니다. DataGridView의 DataBindingComplete 이벤트 처리기에서이 메서드 호출을 실행하여 항상 (재) 크기가 올바르게 조정되는지 확인해야했습니다.
Daan 2014

7
나는 모든 upvotes를 이해하지 못합니다 ... 이것은 전혀 작동하지 않습니다. MSDN 문서 는 명확합니다. 이렇게하면 autoSizeColumnsMode 값이 None 또는 Fill 인 경우 ArgumentException이 발생합니다.
Larry

31

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;
}

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


15

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

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

또한, 나는

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

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

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


그리드의 AutoSizeColumnsMode를 "Fill"로 설정하면 모든 열이 동일한 너비로 설정되는 것 같습니다. 예, 열의 크기를 조정할 수 있지만 초기 너비는 모두 잘못되었습니다. 코드에서 "수동으로"열 너비를 설정해야 할 수도 있습니다.
Stuart Helwig

DV- grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumn-> s <-Mode.Fill; (s를 놓쳤습니다. 왼쪽과 오른쪽에 ColumsMode가 있으므로 해당 줄이 컴파일되지 않습니다.) datagridview를 자동 크기 조정하는 코드는 그 자체로 매우 성가 시므로 적어도 대답을 먼저 확인하십시오 . 그것은 당신이 쓴 첫 번째 줄이며 잘못되었습니다.
barlop

답장 해 주셔서 감사합니다. 질문과 답변을 편집 할 수있는 권한이 있습니다. 내 코드에서 실수를 발견하면 자유롭게 편집하십시오.
Jehof

12

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

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

결과는 다음과 같습니다.

여기에 이미지 설명 입력


9

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

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

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


6

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

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


1
콘텐츠에 따라 열의 크기가 조정되지만 사용 가능한 모든 그리드 공간이 사용되는 것은 아닙니다. 즉, 남아있는 공간이있는 경우 "채우기"하지 않습니다.
Stuart Helwig

5

간단한 두 줄의 코드가 저에게 효과적입니다.

dataGridView.DataSource = dataTable;
dataGridView.AutoResizeColumns();

4

질문의 재개 :
열 너비가 내용에 맞게 조정
되지만 ( 열 전체에 다른 방법으로) 사용자가 열 너비를 설정할 수 있습니다.

Miroslav Zadravec의 대답 에서 개발 중 , 저에게 효과가 있었던 것은 즉시 자동 계산 column.Width을 사용하여 설정하는 것입니다 ... column.Width!

foreach (DataGridViewColumn column in dataGridView.Columns)
{
    if (/*It's not your special column*/)
    {
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
    }
}

//Now do the same using Fill instead of AllCells for your special column

DataGridView같은 트릭을 사용 하여이 이미 생성 되었을 때 작동하도록 테스트되었습니다 .


나는 당신의 코드처럼 foreach를 사용하는 것을 선호합니다. 루프 상단에 수학이 없을 때 더 읽기 쉽습니다. 나는 그렇게했고 "column.Width = column.Width;" 흥미 롭습니다.
그렉 바스

4

이것은 나를 위해 놀라운 일이었습니다.

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

1
간단한 솔루션!
Mark Kram

1
나를 위해 일한 즉, 나중에 없음으로 설정 한 경우에만dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
음주-할 새로운

3

이것은 내용에 따라 모든 열을 자동으로 맞추고, 지정된 열을 늘려 남은 빈 공간을 채우고, 향후 크기 조정을 위해 채울 마지막 열을 설정하여 '점프'동작을 방지합니다.

// autosize all columns according to their content
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// make column 1 (or whatever) fill the empty space
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// remove column 1 autosizing to prevent 'jumping' behaviour
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// let the last column fill the empty space when the grid or any column is resized (more natural/expected behaviour) 
dgv.Columns.GetLastColumn(DataGridViewElementStates.None, DataGridViewElementStates.None).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

나는 그것이 오래된 대답이라는 것을 알고 있지만 열 수를 미리 알지 못하더라도 잘 작동합니다.
Nilo Paim

2

Miroslav Zadravec의 코드에서 가져온 약간 깔끔한 C # 코드는 모든 열이 자동으로 조정된다고 가정합니다.

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

2

Miroslav Zadravec 코드의 또 다른 버전이지만 약간 더 자동화되고 보편적입니다.

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

    }

    void Form1Shown(object sender, EventArgs e)
    {
        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;
        }
    }

두 번째 부분을 별도의 이벤트에 넣었습니다. datagridvew양식 초기화를 작성하고 두 부분이 모두 있으면 아무것도 변경되지 않습니다. 왜냐하면가 datagridview표시된 후에 자동 크기 조정이 너비를 계산하기 때문 이므로 너비는 여전히 Form1()메서드 에서 기본값입니다 . 이 방법을 마친 후 자동 크기 조정이 트릭을 수행하고 그 직후 (양식이 표시 될 때) 코드의 두 번째 부분 (여기서는 Form1Shown이벤트)으로 너비를 설정할 수 있습니다 . 이것은 나를 위해 매력처럼 작동합니다.


2

다음은 C #에서 Miroslav Zadravec의 답변에 대한 단순화 된 코드입니다.

CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width;
CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

1

당신 FillWeight은 당신 의 재산 을 설정하려고 했습니까?DataGridViewColumns개체 ?

예를 들면 :

this.grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.grid1.Columns[0].FillWeight = 1.5;

나는 그것이 당신의 경우에 효과가 있다고 생각합니다.


1

Schnapple 버전에서 약간의 개선

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

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


1

내용에 맞게 설정된 열 너비는 다음 문을 사용하여 문제를 해결했습니다.

첫 번째 단계 :

RadGridViewName.AutoSize = true;

두번째 단계 :

// This mode  fit in the header text and column data for all visible rows. 
this.grdSpec.MasterTemplate.BestFitColumns();

세 번째 단계 :

for (int i = 0; i < grdSpec.Columns.Count; i++) 
{
    // The column width adjusts to fit the contents all cells in the control.
    grdSpec.Columns[i].AutoSizeMode = BestFitColumnMode.AllCells; 
}

1
foreach (DataGridViewColumn c in dataGridView.Columns)
    c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);

dataGridView표시 여부에 관계없이 작동합니다 (즉, 클래스 생성자에서 호출 된 경우에도).

동일한 방법 DataGridViewAutoSizeColumnMode.DisplayedCells이지만를 사용하면 위의 경우 명백한 이유로 실패합니다. 아직 셀이 표시되지 않았습니다! 분명하지 않은 이유로이 경우 AutoResizeColumns에도 실패합니다.


0

예를 들어 데이터 소스를 데이터 테이블에 바인딩하는 경우 바인딩이 완료된 후 속성을 설정해야합니다.

        private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dgv.AutoResizeColumns();
            dgv.AllowUserToResizeColumns = true;
        }

0
  • 관통 반복 상기 용액 (주셔서 감사 DataGridView.Columns변경 AutoSizeMode유효한 하나 수집 폭 값과 변경 후 다시 설정 AutoSizeModeDataGridViewAutoSizeColumnMode.None ).
  • 나는 고투하고,이 클래스 생성자 또는 그 이전 어느 라인에서 호출 될 때마다 작동하지 않습니다 눈치 Form.Show()Form.ShowDialog(). 그래서이 코드 스 니펫을 Form.Shown이벤트에 넣었고 이것은 저에게 효과적입니다.
  • DataGridView.AutoSizeColumnsMode이전에 설정 한 내용에 상관없이 내 변환 된 코드 DataGridViewColumn.GetPreferredWidth()를 변경 하는 대신 사용 DataGridViewColumn.AutoSizeMode하고 너비 값을 즉시 설정 한 다음 DataGridView.AutoSizeColumnsMode한 번 변경 합니다.

    private void form_Shown(object sender, EventArgs e)
    {
            foreach (DataGridViewColumn c in dataGridView.Columns)
                c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true);
            dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }
  • 설정하십시오

            dataGridView.AllowUserToResizeColumns = true;
  • 양식이 표시된 후에 만 ​​이것이 어떻게 작동하는지 모르겠습니다.


0

VB에서이 작업을 수행해야했고 모듈에 배치 한 메서드로 분할하는 것을 선호합니다. 원하는 경우 Fill 열을 다른 ByRef 매개 변수로 추가 할 수 있습니다.

''' <summary>
''' Makes all columns in a DataGridView autosize based on displayed cells,
''' while leaving the column widths user-adjustable.
''' </summary>
''' <param name="dgv">A DataGridView to adjust</param>
Friend Sub MakeAdjustableAutoSizedGridCols(ByRef dgv As DataGridView)
    Dim width As Integer

    For Each col As DataGridViewColumn In dgv.Columns
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        width = col.Width
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        col.Width = width
    Next
    dgv.AllowUserToResizeColumns = True
End Sub

0

다음과 같이 할 수 있습니다.

   grd.DataSource = getDataSource();

    if (grd.ColumnCount > 1)
    {
        for (int i = 0; i < grd.ColumnCount-1; i++)
            grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

        grd.Columns[grd.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }

    if (grd.ColumnCount==1)
        grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

마지막 열이 그리드를 채우는 것을 제외하고 모든 열이 내용에 맞게 조정됩니다.


0

$ array가 PSCustomObject의 내용이므로 다음과 같이 작동합니다.

$dataGridView1.DataSource=[collections.arraylist]($array)
$dataGridView1.Columns | Foreach-Object{$_.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::AllCells}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.