简体   繁体   English

如何使 DataGridView 的宽度和高度适合其内容?

[英]How to fit DataGridView width and height to its content?

I have a method to create DataGridView dynamically but when it is shown up, the width is greater than the content width (total width of the columns).我有一种动态创建 DataGridView 的方法,但是当它显示出来时,宽度大于内容宽度(列的总宽度)。 Also the height has not enough length to meet the length of the rows.高度也没有足够的长度来满足行的长度。

I tried using this method but it didn't work:我尝试使用这种方法,但没有奏效:

    DataGridView CreateInputBox(int proc, int mac)
        {
            DataGridView databox = new DataGridView();
            for (int i = 0; i < mac; i++)
            {
                databox.Columns.Add("col" + (i + 1), "M" + (i + 1));
                databox.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                databox.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
            }
            databox.RowTemplate.DefaultHeaderCellType = typeof(CustomHeaderCell);
            databox.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
            databox.RowHeadersDefaultCellStyle.Padding = new Padding(2);
            for (int i = 0; i < proc; i++)
            {
                databox.Rows.Add();
                databox.Rows[i].HeaderCell.Value = "P" + (i + 1);
            }
            databox.DefaultCellStyle.SelectionBackColor = Color.LightGray;
            databox.AllowUserToAddRows = false;
            databox.AllowUserToDeleteRows = false;
            databox.AllowUserToOrderColumns = false;
            databox.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            databox.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

            //This block doesn't work
            var totalHeight = databox.Rows.GetRowsHeight(DataGridViewElementStates.None);
            var totalWidth = databox.Columns.GetColumnsWidth(DataGridViewElementStates.None);
            databox.Width = totalWidth;
            databox.Height = totalHeight;
            //
            return databox;
        }
    public class CustomHeaderCell : DataGridViewRowHeaderCell
    {
        protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
        {
            var size1 = base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize);
            var value = string.Format("{0}", this.DataGridView.Rows[rowIndex].HeaderCell.FormattedValue);
            var size2 = TextRenderer.MeasureText(value, cellStyle.Font);
            var padding = cellStyle.Padding;
            return new Size(size2.Width + padding.Left + padding.Right, size1.Height);
        }
        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, DataGridViewPaintParts.Background);
            base.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
            TextRenderer.DrawText(graphics, string.Format("{0}", formattedValue), cellStyle.Font, cellBounds, cellStyle.ForeColor);
        }
    }

Result:结果:

在此处输入图片说明

As you can see the width of the DataGridView control is so long.如您所见,DataGridView 控件的宽度如此之长。 How can I fit it for both dimension?我怎样才能适应这两个维度?

The main problem is that your newly created DataGridView has not finished its internal layout before being added to a parent container and will still report all columns as having a width = 100.主要问题是您新创建的DataGridView在添加到父容器之前尚未完成其内部布局,并且仍将报告所有列的宽度为 100。

One way to fix it is to call a sizing function after the DGV has been displayed:修复它的一种方法是在显示 DGV调用大小调整函数:

void sizeDGV(DataGridView dgv)
{
    DataGridViewElementStates states = DataGridViewElementStates.None;
    dgv.ScrollBars = ScrollBars.None;
    var totalHeight = dgv.Rows.GetRowsHeight(states) + dgv.ColumnHeadersHeight;
    totalHeight += dgv.Rows.Count * 4  // a correction I need
    var totalWidth = dgv.Columns.GetColumnsWidth(states) + dgv.RowHeadersWidth;
    dgv.ClientSize = new Size(totalWidth , totalHeight );
}

在此处输入图片说明

Note that I have fixed a few things along the way:请注意,我在此过程中修复了一些问题:

  • Both width and height did not include the headers宽度和高度都不包括标题
  • changing the outer size ignores the border.更改外部尺寸会忽略边框。 I change the ClientSize instead.我改为更改 ClientSize。
  • Before the size can work we need to switch off the scroll bars.在大小可以工作之前,我们需要关闭滚动条。

Just use只需使用

dataGridView1.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Full code:完整代码:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public Form1()
{
    InitializeComponent();

    List<Person> persons = new List<Person> {new Person() {ID = 0, Name = "one"}, new Person() {ID = 1, Name = "two"}, new Person() {ID = 2, Name = "tree"}, new Person() {ID = 3, Name = "four"}};
    dataGridView1.DataSource = persons;
    dataGridView1.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
}

private System.Windows.Forms.DataGridView dataGridView1;
private void InitializeComponent()
{
    this.dataGridView1 = new System.Windows.Forms.DataGridView();
    ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
    this.SuspendLayout();
    // 
    // dataGridView1
    // 
    this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
    this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
    this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
    this.dataGridView1.Location = new System.Drawing.Point(0, 0);
    this.dataGridView1.Name = "dataGridView1";
    this.dataGridView1.Size = new System.Drawing.Size(284, 262);
    this.dataGridView1.TabIndex = 0;
    // 
    // Form1
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(284, 262);
    this.Controls.Add(this.dataGridView1);
    this.Name = "Form1";
    this.Text = "Form1";
    ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
    this.ResumeLayout(false);

}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM