DataGridView 자동 맞춤 및 채우기


82

DataGridView. 내가하려는 것은 처음 두 개의 열이 내용의 너비에 자동으로 맞춰지고 세 번째 열이 나머지 공간을 채우도록하는 것입니다.

WinForms에서 할 수 있습니까? 사용하는 경우 EF DataContext에서 내 데이터를로드하고 있습니다. 현재 어떻게 보이는지 이미지를 포함했습니다.

여기에 이미지 설명 입력

답변:


165

DataGridViewColumn.AutoSizeMode속성 을 사용해야합니다 .

열 0 및 1에 대해 이러한 값 중 하나를 사용할 수 있습니다.

AllCells : 헤더 셀을 포함하여 열에있는 모든 셀의 내용에 맞게 열 너비가 조정됩니다.
AllCellsExceptHeader : 헤더 셀을 제외한 열에있는 모든 셀의 내용에 맞게 열 너비가 조정됩니다.
DisplayedCells : 머리글 셀을 포함하여 현재 화면에 표시된 행에있는 열의 모든 셀 내용에 맞게 열 너비가 조정됩니다.
DisplayedCellsExceptHeader : 헤더 셀을 제외하고 현재 화면에 표시된 행에있는 열의 모든 셀 내용에 맞게 열 너비가 조정됩니다.

그런 다음 2 열에 채우기 값을 사용합니다.

모든 열의 너비가 컨트롤의 표시 영역을 정확하게 채우도록 열 너비가 조정됩니다.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

다른 사용자가 지적했듯이 기본값 datagridviewDataGridView.AutoSizeColumnsMode속성 수준 에서 설정할 수 있습니다 .

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

다음과 같을 수 있습니다.

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

중요 사항:

그리드가 데이터 소스에 바인딩과 열이 자동 생성 (있는 경우 AutoGenerateColumns속성을 true로 설정), 당신은 사용할 필요가 DataBindingComplete스타일을 적용하는 이벤트를 후에 열이 생성되었습니다.


일부 시나리오 (예 : 코드로 셀 값 변경)에서는 DataGridView1.AutoResizeColumns();그리드를 새로 고치려면 호출 해야했습니다.


1
DataBindingComplete 이벤트를 사용할 때 완벽하게 작동합니다.
James Jeffery 2013 년

DataGrid가 채워진 후 DataBindingComplete 메서드를 호출하는 방법을 알 수 없습니다
Dan

@Dan DataBindingComplete는 메서드 가 아니며 구독해야하는 datagridview 이벤트 입니다. 이 답변 stackoverflow.com/a/31685874/2387010 은 예를 제공합니다. 도움이 되나요?
Chris

예제를 설명하면 도움이되지만 충분합니다. 당신이 게시물에 연결된 것을 MSDN 문서 내 패턴으로 사용하지만이 호출되는 방법을 알아낼 수 없습니다 것입니다 방법으로 쇼를.
Dan

1
@Chris는 누락 된 정보가 확실히 도움이됩니다. 감사합니다. 나는 읽고있다 이 책을단지 희망 조금 더 이해하게됩니다이 때문에 대의원 및 람다 함수에 대한 장에 도착. 감사합니다!
Dan

22

이것이 제가 가장 좋아하는 접근 방식입니다 ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

열 크기가 0이면 index out of bound exception수정하십시오.
TiyebM

14

제어 속성에서 속성을 변경하십시오. AutoSizeColumnsMode:Fill

또는 코드

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
감사합니다. 나는 이와 같은 해결책을 찾고 있었다! :)
알린 Ciocan

4

테스트되지 않았지만 시도해 볼 수 있습니다. 테스트 및 작동 중입니다. 나는 당신이 당신이 필요 로 AutoSizeMode하는 DataGridViewColum것을 달성하기 위해 당신이 놀 수 있기를 바랍니다 .

설정 시도

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

이것은 작동합니다


이것은 작동하지 않습니다. DataContext에서 데이터 소스가 추가되기 전에 양식이 초기화 될 때 설정합니다. 그게 이유일까요? 런타임에 데이터가로드되고 EF 모델에서 열을 가져 오므로 어디에 설정해야할지 모르겠습니다.
James Jeffery 2013 년

그런 것처럼 보이지만 세 번째 줄은 작동하지 않습니다. 10 분 전에 테스트했습니다.
국왕

@JamesJeffery 열을 자동으로 채우거나 수동으로 채우십니까?
Sriram Sakthivel 2013 년

@SriramSakthivel dataGridView1.DataSource 속성을 사용하여 DataContext에서 반환 된 List를 바인딩하고 있습니다.
James Jeffery 2013 년

0

시도해보십시오.

 AutoSizeColumnMode = Fill;

0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

1
이 코드는 좋지 않습니다. 먼저 모든 열의 너비 모드를 같은 값 (<열 수>)으로 설정하는 중첩 루프가 필요하지 않습니다. 에서 직접 각 열의 AutoSizeMode 및 FillWeight 속성에 액세스 할 수 있습니다 GridCol. 둘째, 각 열의 AutoSizeMode를 두 개의 다른 값으로 설정합니다. 두 번째 할당은 첫 번째 할당을 덮어 씁니다.
JonP

0

AlfredBr의 답변을 구축하려면 일부 열을 숨긴 경우 다음을 사용하여 모든 열의 크기를 자동으로 조정 한 다음 마지막으로 보이는 열이 빈 공간을 채우도록 할 수 있습니다.

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

이것은 모든 열이 그것을 할 수 없을 때 "first_name"열이 공간을 채우도록하기 위해 내가 한 일입니다.

그리드가 작아지면 "first_name"열이 거의 보이지 않게 (매우 얇게) 표시되므로 DataGridViewAutoSizeColumnMode를 다른 표시 열로 AllCells로 설정할 수 있습니다. 성능 문제의 경우 데이터를 바인딩하기 전에 None으로 설정하고 그리드의 DataBindingComplete 이벤트 핸들러에서 AllCell로 다시 설정하는 것이 중요합니다. 도움이 되었기를 바랍니다.

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }

-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}

그냥 함수를 호출, 그것의 행의 수에 따라 DataGridView에 높이를 결정하는 처리됩니다
두르가 프라 사드 Guntoju

1
우선, 그것은 OP의 질문에 대답하지 않습니다. 또한 (향후 참조를 위해) 답변 자체에 이러한 주석을 포함하십시오 (편집 가능).
Joel

-2

이 시도 :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.