【发布时间】:2013-09-11 01:46:16
【问题描述】:
我的DataGridView 中有 3 列。我想要做的是让前 2 列自动适应内容的宽度,并让第 3 列填充剩余空间。
是否可以在 WinForms 中进行?如果有任何用处,我将从 EF DataContext 加载我的数据。我已经附上了它当前外观的图片。
【问题讨论】:
标签: c# winforms datagridview
我的DataGridView 中有 3 列。我想要做的是让前 2 列自动适应内容的宽度,并让第 3 列填充剩余空间。
是否可以在 WinForms 中进行?如果有任何用处,我将从 EF DataContext 加载我的数据。我已经附上了它当前外观的图片。
【问题讨论】:
标签: c# winforms datagridview
您需要使用DataGridViewColumn.AutoSizeMode 属性。
您可以对第 0 列和第 1 列使用以下值之一:
AllCells: 调整列宽以适合所有单元格的内容 列,包括标题单元格。
AllCellsExceptHeader: 调整列宽以适应列中所有单元格的内容,不包括标题单元格。
DisplayedCells: 列宽调整为 适合当前在行中的列中所有单元格的内容 显示在屏幕上,包括标题单元格。
DisplayedCellsExceptHeader: 调整列宽以适应 当前在行中的列中所有单元格的内容 显示在屏幕上,不包括标题单元格。
然后你对第 2 列使用 Fill 值
调整列宽,使所有列的宽度完全填满控件的显示区域...
this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
正如其他用户所指出的,可以使用DataGridView.AutoSizeColumnsMode 属性将默认值设置为datagridview 级别。
this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
可能是:
this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
重要提示:
如果您的网格绑定到数据源并且列是自动生成的(AutoGenerateColumns 属性设置为 True),您需要使用 DataBindingComplete 事件来应用样式AFTER列创建的。
在某些情况下(例如通过代码更改单元格值),我必须调用 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;
这应该可以工作
【讨论】:
尝试做,
AutoSizeColumnMode = 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 和 FillWeight 属性。其次,它将每列的 AutoSizeMode 设置为两个不同的值;第二个分配将覆盖第一个。
以 AlfredBr 的回答为基础,如果您隐藏了一些列,您可以使用以下方法自动调整所有列的大小,然后让最后一个可见列填充空白区域:
myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill;
【讨论】:
这是我所做的,以便在所有列都无法做到这一点时让“first_name”列填充空间。
当网格变小时,“first_name”列几乎不可见(非常薄),因此我可以将DataGridViewAutoSizeColumnMode 属性设置为AllCells,作为其他可见列。对于性能问题,重要的是在数据绑定之前将它们设置为None,并在网格的DataBindingComplete 事件处理程序中设置回AllCells。希望对您有所帮助!
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);
}
【讨论】:
试试这个:
DGV.AutoResizeColumns();
DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
【讨论】: