我有一个以编程方式填充的DataGridView
。列设置为根据单元格内容自动调整大小。
DataGridView
将填充有关液压和气动原理图的零件信息。我的表单只有SplitContainer
,PictureBox
和DataGridView
。 SplitterDistance
与DataGridView
的宽度相关联。
DataGridView
最多只有6列(“索引”,“部件号”,“序列号”,“图号”,“页码”,“修订号”) 和至少2列,具体取决于原理图要求。所以我想相应地调整控件的大小。
如何让DataGridView
控件调整为列的总宽度,以便滚动条不显示?
答案 0 :(得分:5)
在网格加载数据并且相应地调整了列之后执行以下代码(假设您在运行时设置了列' AutoSize属性)。
dataGridView1.Width =
dataGridView1.Columns.Cast<DataGridViewColumn>().Sum(x => x.Width)
+ (dataGridView1.RowHeadersVisible ? dataGridView1.RowHeadersWidth : 0) + 3;
它在做什么:
3
更多,因为没有它,水平滚动条会一直显示 - 可能是因为网格周围有边距/填充,我不确定。答案 1 :(得分:1)
好的,以澄清你想要的东西(并回答它)
我想你想让DataGridView的宽度扩大,所以不会出现水平滚动条? (顺便说一下,你可以增加包含它的表格)
例如,现在我有
那里有第1,2和3列。
我希望datagridview扩展到适合所有列的大小
让我们说要添加更多数据
我可以用这两行来扩展细胞,
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
但我仍然得到一个水平滚动条,因为datagridview的大小没有改变。即使每列的大小都有。
我可以看到有一个datagridview1.Size属性和一个dataGridView1.Width属性。两者都可以使用。
另请注意,在第一列之前有一个有趣的列。
因此,如果你确实使dataGridView1.Width等于cols 1,2,3的大小,你仍然有一个滚动条,因为那个有趣的列就像标题为&#的列左边的那样34;第1栏和第34栏;我看它有50个单位的宽度。因此,如果您使dataGridView1.Width = 50加上每列的宽度,那么灰色的dataGridView区域将始终足够大以包含所有列。
我绘制了一个datagridview和一个文本框,文本框显示了datagridview.Width的大小,所有列的总宽度以及每个列的宽度。
这对我有用。因此,列的大小会根据内容的大小而扩大或缩小,但不仅如此...... DataGridView.Width将增加50(最左边的有趣列),加上所有常规/其余列的大小。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace automaticallyexpanddatagridviewsizeandformsize
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// MessageBox.Show(dataGridView1.Size.Width.ToString());
// note that with these two set you can't change the width of a column
// also MininimumWidth would limit changing the width of a column too,
//http://stackoverflow.com/questions/2154154/datagridview-how-to-set-column-width
// but that doesn't matter because we aren't programmatically changing the width of any column.
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
int olddgvsize = dataGridView1.Width;
textBox1.Text = dataGridView1.Columns[0].Width.ToString();
int h=dataGridView1.Height;
int tw = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
// MessageBox.Show(dataGridView1.Columns[i].Width.ToString());
tw += dataGridView1.Columns[i].Width;
}
tw += 50; // column before col 0..
//you only need one of these.
//though to better understand the code you can try to comment out both and see how the total width of all columns (tw)(+50) so ALL the columns, differs from the DataGridView.Width (the total area which includes all columns plus some grey if it's much bigger than all the columns)
dataGridView1.Size = new Size(tw, h);
dataGridView1.Width = tw;
textBox1.Text = "tw=" + tw + " " + "dgvw=" + " " +dataGridView1.Width+ " "+"col 1:" + dataGridView1.Columns[0].Width + " col 2:" + dataGridView1.Columns[1].Width + " col 3:"+ dataGridView1.Columns[2].Width;
int newdgvsize = dataGridView1.Width;
int differenceinsizeofdgv = newdgvsize - olddgvsize;
this.Width = this.Width + differenceinsizeofdgv;
}
}
}
所以例如我有
tw是所有列的总宽度(所有列都包括第1列左侧的奇怪列,我认为它的宽度为50,可能是)
dgvw是dataGridView.Width
由于上面的代码,dgvw扩展为tw。
上面的代码也按照dataGridView扩展的数量扩展了表单。
答案 2 :(得分:0)
以下是调整datagridview width
的方法示例private void Form1_Load(object sender, EventArgs e)
{
//Create datagridview and button below it.
DataGridView dgv = new DataGridView();
dgv.Columns.Add("Column1","Column1");
dgv.Rows.Add(2);
dgv.AllowUserToAddRows = false;
this.Controls.Add(dgv);
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
int tw;
tw = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dgv.RowHeadersWidth + 2;
dgv.Width = tw;
// the cellleave, is done before the autoresize.
// but performing a button click, that triggers a cell autoresize!
//performing a click to a button added to the form..does the autoresize.
// so the resie has to be done after the click... either in the click code, or in the celleave procedure after the performclick.
Button by = new Button();
this.Controls.Add(by); // necessary for the dgv to resize
// but doesn't need the code to necessarily be within the click.
by.Click += (object ssender, EventArgs ee) => { };
dgv.CellEndEdit += (object ssender, DataGridViewCellEventArgs ee) => {
by.PerformClick();
tw = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dgv.RowHeadersWidth + 2;
dgv.Width = tw;
};
}