我的专栏中有3列DataGridView
。我想做的是让前2列自动适合内容的宽度,并让第3列填充剩余的空间。
是否可以在WinForms中进行?如果可以的话,我正在从EF DataContext加载数据。我提供了一张有关当前外观的图片。
我的专栏中有3列DataGridView
。我想做的是让前2列自动适合内容的宽度,并让第3列填充剩余的空间。
是否可以在WinForms中进行?如果可以的话,我正在从EF DataContext加载数据。我提供了一张有关当前外观的图片。
Answers:
您需要使用该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设置为两个不同的值;第二个任务将覆盖第一个任务。
这是我为了使列“ 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);
}