내 DataGridView
. 내가하려는 것은 처음 두 개의 열이 내용의 너비에 자동으로 맞춰지고 세 번째 열이 나머지 공간을 채우도록하는 것입니다.
WinForms에서 할 수 있습니까? 사용하는 경우 EF DataContext에서 내 데이터를로드하고 있습니다. 현재 어떻게 보이는지 이미지를 포함했습니다.
답변:
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;
다른 사용자가 지적했듯이 기본값 datagridview
은 DataGridView.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();
그리드를 새로 고치려면 호출 해야했습니다.
이것이 제가 가장 좋아하는 접근 방식입니다 ...
_dataGrid.DataBindingComplete += (o, _) =>
{
var dataGridView = o as DataGridView;
if (dataGridView != null)
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
};
index out of bound exception
수정하십시오.
제어 속성에서 속성을 변경하십시오.
AutoSizeColumnsMode:Fill
또는 코드
dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;
테스트되지 않았지만 시도해 볼 수 있습니다. 테스트 및 작동 중입니다. 나는 당신이 당신이 필요 로 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;
이것은 작동합니다
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);
}
}
GridCol
. 둘째, 각 열의 AutoSizeMode를 두 개의 다른 값으로 설정합니다. 두 번째 할당은 첫 번째 할당을 덮어 씁니다.
AlfredBr의 답변을 구축하려면 일부 열을 숨긴 경우 다음을 사용하여 모든 열의 크기를 자동으로 조정 한 다음 마지막으로 보이는 열이 빈 공간을 채우도록 할 수 있습니다.
myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill;
이것은 모든 열이 그것을 할 수 없을 때 "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;
}
public void setHeight(DataGridView src)
{
src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 + src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}