调整DataGridView宽度以适应列大小

6

我有一个DataGridView,是通过编程填充的。根据单元格内容设置自动调整列宽度。

DataGridView将显示有关液压和气动原理图零件信息。我的表单只有一个SplitContainer、一个PictureBoxDataGridViewSplitterDistanceDataGridView的宽度相连。

DataGridView最多只有6列 ("Index", "Part Number", "Serial Number", "Drawing Number", "Page Number", "Revision Number"),最少2列,具体取决于原理图的要求。因此,我希望相应地调整控件的大小。

如何使DataGridView控件调整为列的总宽度,以便不出现滚动条?


DataGridView将填充有关液压和气动原理图的零件信息,我的表单只有SplitContainer、PictureBox和DataGridView,SplitterDistance与DataGridView的宽度相关联,DataGridView最多只有6列:“索引”、“零件编号”、“序列号”、“图纸编号”、“页码”、“修订号”,根据原理图要求最少有2列。因此,我想相应地调整控件大小。 - Jared6243
DV与液压完全无关。 - barlop
3个回答

11
在网格加载数据并调整列宽后,执行以下代码(假设您在运行时设置了列的AutoSize属性)。
dataGridView1.Width =
    dataGridView1.Columns.Cast<DataGridViewColumn>().Sum(x => x.Width)
    + (dataGridView1.RowHeadersVisible ? dataGridView1.RowHeadersWidth : 0) + 3;

它在做什么:

  • 使用LINQ计算所有列的宽度总和,
  • 检查“行标头”是否可见,如果可见则加上宽度,
  • 添加3,否则水平滚动条会��直出现-可能是因为网格周围存在边距/填充。

2
如果需要的话,可以将 +3 替换为 dataGridView1.Margin.Horizontal;并且可以使用 (new int[] {...).Min(); 来限制宽度,例如将其限制在 Parent.WidthdataGridView1.Maximum.Width 上,以解决 @GrantWinney 的问题。 - woodvi
1
要考虑隐藏的列,请使用以下代码:Columns.Cast<DataGridViewColumn>().Where(x => x.Visible).Sum(x => x.Width) - 这不是原始问题中的内容,但其他人(比如我)可能会在这种情况下尝试使用此代码。 - Loring
您还应该添加 SystemInformation.VerticalScrollBarWidth。 - Elmue

1

好的,为了澄清您的需求(并回答它),我认为您希望使DataGridView的宽度自动扩展,以便不会出现水平滚动条?(顺便说一下,您也可以将包含它的表单增大)

例如,现在我有:

enter image description here

这里有三列,分别是1、2和3。

我希望datagridview能够扩展到适合所有列的大小。

enter image description here

假设有更多的数据被添加进来

我可以通过这两行代码扩展单元格,

dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

但我仍然会出现水平滚动条,因为DataGridView的大小没有改变,即使每列的大小已经改变。

enter image description here

我可以看到有一个datagridview1.Size属性和一个dataGridView1.Width属性,两者都可以使用。
还要注意一下,在第一列之前有一种奇怪的列。
因此,如果您将dataGridView1.Width设置为cols 1,2,3的大小,仍然会出现滚动条,因为在标记为“column 1”的列左侧有一种奇怪的列。我看到它的宽度为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, 
            //https://dev59.com/6XI95IYBdhLWcg3wyRE0
            // 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是所有列的总宽度(包括位于第一列左侧的奇怪列,我认为其宽度为50,但可能不是)

dgvw是dataGridView的宽度

enter image description here

由于上述代码,dgvw可以与tw一起扩展。

enter image description here

上述代码还通过dataGridView扩展的数量来扩展表单。


虽然它不是动态的。 - barlop
这个可能是动态的 https://dev59.com/hHNA5IYBdhLWcg3wSrqa,而这个有问题 https://dev59.com/UkfRa4cB1Zd3GeqP5gNB#se8YoYgBc1ULPQZFGYM- - barlop

0
这是一个调整 datagridview 宽度的示例:
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;
    };

}

另一种生成它的替代方法是绘制一个DataGridView和2个按钮以及一个文本框。两个按钮分别为“调整大小”和“显示宽度”,“显示宽度”将写入文本框“tw=___ dgvwidth=__”,而“调整大小”将调整其大小。 - barlop
这个问题提到的技术是调整DataGridView的大小。http://stackoverflow.com/questions/37635932/calculate-padding-of-datagridview-when-padding-is-greater-than-two - barlop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接