这个问题在这里没有被问过,因为改变字体是特别的。其他答案有一个解决方案,在字体更改后无法正常工作。
修复宽度按钮用于设置datagridview的宽度,因此没有滚动条。
如果我单击添加行,然后修复宽度然后更改字体然后修复宽度,然后修复宽度不起作用。所以要标记它们A,B,C,D
A)添加行< - WORKS
B)固定宽度< --- WORKS
C)改变字体< --- WORKS
D)固定宽度,< --- FAILS
修复宽度在B行上工作,但在D行失败,即在字体更改后失败。
我有另一种获取最小宽度的方法,我已经包含了它,但它们都没有工作。所以宽度没有正确设置。
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 dgvblah1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.AllowUserToAddRows = false; // maybe doesn't make a difference here for some reaosn.
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView1.Columns.Add("Col1", "Col1");
dataGridView1.Rows.Add(1);
/*
btnaddrow.PerformClick();
btnchangefont.PerformClick();
btnaddrow.PerformClick();
btnfixwidth.PerformClick(); //fail
*/
}
private int seeifworks_get_min_dgv_width_A(DataGridView dgv)
{
// it's not too bad, it sometimes makes it the correct width and sometimes not quite enough, and so it's worth then running the next method that increments the width until there are no more horizontal scroll bars.
int padding = 2; // clearly wrong here, it seems
int tw = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dgv.RowHeadersWidth + padding + 2;
int th = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None) + dgv.ColumnHeadersHeight;
return tw;
}
private int seeifworks_get_min_dgv_width_B(DataGridView dgv)
{
// http://stackoverflow.com/questions/6651487/programmatically-resize-datagridview-to-remove-scroll-bars
// Add two pixels for the border for BorderStyles other than None.
var controlBorderWidth = (dgv.BorderStyle == BorderStyle.None) ? 0 : 2;
// Return the width of all columns plus the row header, and adjusted for the DGV's BorderStyle.
return dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + dgv.RowHeadersWidth + controlBorderWidth;
}
private void btnfixwidth_Click(object sender, EventArgs e)
{
// dataGridView1.Width = seeifworks_get_min_dgv_width_A(dataGridView1);
dataGridView1.Width = seeifworks_get_min_dgv_width_B(dataGridView1);
}
private void btnaddrow_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add(1);
}
private void btnchangefont_Click(object sender, EventArgs e)
{
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
for (int i = 0; i < dataGridView1.Rows.Count; i++)
dataGridView1.Rows[i].DefaultCellStyle.Font = new Font("Courier New", 30, FontStyle.Bold);
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
}
}
}
答案 0 :(得分:1)
当垂直scollbar不可见时,方法可以正常工作,但如果通过更改fond并添加垂直滚动条可见的行,则还应将滚动条的宽度添加到计算的列宽。以下是计算DataGridView
的首选宽度的方法的更好版本:
private int GetPreferredWidth(DataGridView grid)
{
var border = 0;
if (grid.BorderStyle == BorderStyle.FixedSingle)
border = 2 * SystemInformation.BorderSize.Width;
var vscrollWidth = 0;
var vscroll = dataGridView1.Controls.OfType<VScrollBar>().FirstOrDefault();
if (vscroll != null && vscroll.Visible)
border += vscroll.Width;
var columnsWidth = grid.Columns.GetColumnsWidth(DataGridViewElementStates.Visible);
var rowHeadersWidth = 0;
if (grid.RowHeadersVisible)
rowHeadersWidth = grid.RowHeadersWidth;
return columnsWidth + vscrollWidth + rowHeadersWidth + border;
}
同样grid.GetPreferredSize(new Size(0, 0)).Width;
是一个不错的选择,但它会增加一些额外的宽度。如果您不介意额外的宽度,那么额外的尺寸,您可以使用GetPreferredSize
方法。