Stu*_*wig 107 c# datagridview winforms
我在Windows窗体上填充DataGridView控件(C#2.0而不是WPF).
我的目标是显示一个整齐地填充所有可用宽度的网格 - 即右侧没有未使用的(深灰色)区域,并根据其包含的数据适当地调整每列的大小,但也允许用户调整任何列的大小他们喜欢.
我试图通过将每列的AutoSizeMode设置为DataGridViewAutoSizeColumnMode.AllCells来实现此目的,除了我设置为DataGridViewAutoSizeColumnMode.Fill的列之一,以确保网格的整个区域整齐地填充数据.(我不介意当用户尝试调整此列的大小时,它会弹回一个确保始终使用水平空间的大小.)
但是,正如我所提到的,一旦加载,我想允许用户调整列的大小以满足他们自己的要求 - 在为每个列设置这些AutoSizeMode值时,用户就无法再调整这些列的大小.
我试过没有设置允许调整大小的所有列的AutoSizeMode但是没有根据单元格包含的数据设置初始大小.加载数据后将网格的AutoSizeMode更改回"未设置"时会出现相同的结果.
是否有一个我在这里缺少的设置允许自动设置默认列宽和用户调整大小,还是在填充DataGridView控件时我必须使用另一种技术?
Mir*_*vec 126
这个技巧对我有用:
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;
}
Run Code Online (Sandbox Code Playgroud)
这里发生的是你将自动调整大小设置为你需要的模式,然后逐列存储从自动调整计算得到的宽度,删除自动调整大小并将宽度设置为之前存储的值.
小智 44
也许你可以打电话
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);
Run Code Online (Sandbox Code Playgroud)
设置数据源后.它将设置宽度并允许调整大小.
有关MSDN DataGridView.AutoResizeColumns方法(DataGridViewAutoSizeColumnsMode)的更多信息.
Tom*_*idd 31
AC#版本的Miroslav Zadravec的代码
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;
}
Run Code Online (Sandbox Code Playgroud)
发布为社区维基,以免贬低他人的声誉
Jeh*_*hof 13
在我的应用程序中,我已设置
grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
Run Code Online (Sandbox Code Playgroud)
另外,我已经设定了
grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;
Run Code Online (Sandbox Code Playgroud)
现在可以更改列宽,并且可以由用户重新排列列.这对我很有用.
也许这对你有用.
Sar*_*avu 11
将数据添加到网格后,添加以下代码,该代码将根据每个单元格中的数据长度调整列
dataGrid1.AutoResizeColumns();
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
Run Code Online (Sandbox Code Playgroud)
这是结果

小智 8
好吧,我是这样做的:
dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;
Run Code Online (Sandbox Code Playgroud)
在那个特定的顺序.列被调整大小(扩展)并且用户可以在之后调整列的大小.
如果我正确地理解了这个问题,应该有一种更简单的方法来完成你所需要的.呼叫
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
这应该够了吧.但是,有一个缺陷,因为在填充DataGridView控件后不能直接调用此方法.相反,您必须为VisibleChanged事件添加一个EventHandler并在那里调用该方法.
问题的简历:让
列宽适应内容(跨列使用不同的方法),
然后允许用户设置列宽......
从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
Run Code Online (Sandbox Code Playgroud)
这是测试工作时,DataGridView已经创建,使用这样一招这样。
简单的两行代码对我有用。
dataGridView.DataSource = dataTable;
dataGridView.AutoResizeColumns();
Run Code Online (Sandbox Code Playgroud)