C# 无法分配datagridview.columns[i].Width属性
我正在编写一个方法,该方法将调整datagridview中的列的大小,以便所有数据都可见,并且这些列将完全填充datagridview。我正在做的是: 1) 将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据 2) 计算最后一列的右边缘与数据栅格视图的右边缘之间的像素距离 3) 将该距离除以列数。这给了我应该添加到每列的宽度,以完全填充datagridview 4) 将宽度从(3)添加到每列 理论上,这将显示列中的所有数据,并完全填充datagridview 当C# 无法分配datagridview.columns[i].Width属性,c#,datagridview,resize,C#,Datagridview,Resize,我正在编写一个方法,该方法将调整datagridview中的列的大小,以便所有数据都可见,并且这些列将完全填充datagridview。我正在做的是: 1) 将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据 2) 计算最后一列的右边缘与数据栅格视图的右边缘之间的像素距离 3) 将该距离除以列数。这给了我应该添加到每列的宽度,以完全填充datagridview 4) 将宽度从(3)添加到每列 理论上,这将显示列中的所有数据,并完全填
DataGridViewAutoSizeColumnsMode
设置为fill
时,列宽都相等。但是,并非所有数据的宽度都相同。因此,当ColumnsMode
设置为fill时,一些单元格中的数据从边缘流出,而其他单元格中则有一堆空白。但是如果设置为AllCells
,则最右边的列和datagridview的右边缘之间会有一个很大的间隙
关于问题:我似乎无法设置列宽属性。我确实意识到我没有考虑总列宽大于datagridviewwidth的情况
private void autoSizeDGV(DataGridView dgv)
{
try
{
//Step 1
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
//Step 2
int totalcellwidth = 0;
for (int i = 0; i < dgv.ColumnCount; i++)
{
totalcellwidth += dgv.Columns[i].Width;
}
//Step 3
int widthtoadd = (dgv.Width - totalcellwidth)/dgv.ColumnCount;
//Step 4
for (int i = 0; i < dgv.ColumnCount; i++)
{
Debug.WriteLine("previous dgv.Columns[" +i+ "]: " + dgv.Columns[i].Width);
dgv.Columns[i].Width += widthtoadd;
Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
}
}
private void autosizedv(DataGridView dgv)
{
尝试
{
//第一步
dgv.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
//步骤2
int totalcellwidth=0;
对于(int i=0;i
好吧,我回答了我自己的问题。dgv.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
语句将覆盖对列宽的任何非用户更改。因此,尝试通过编程更改列宽是不可能的。但通过使用dgv.AutoResizeColumns();
替代它,一切都可以正常工作
因此,正确的方法是:
private void autoSizeDGV(DataGridView dgv)
{
try
{
//Step 1
dgv.AutoResizeColumns();
//Step 2
int totalcellwidth = 0;
for (int i = 0; i < dgv.ColumnCount; i++)
{
totalcellwidth += dgv.Columns[i].Width;
}
//Step 3
int widthtoadd = (dgv.Width - totalcellwidth) / dgv.ColumnCount;
//Step 4
for (int i = 0; i < dgv.ColumnCount; i++)
{
Debug.WriteLine("previous dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
dgv.Columns[i].Width += widthtoadd;
Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
}
}
private void autosizedv(DataGridView dgv)
{
尝试
{
//第一步
dgv.AutoResizeColumns();
//步骤2
int totalcellwidth=0;
对于(int i=0;i
如果您的代码负责设置列宽,您不应该将AutoSizeColumnsMode
设置为DataGridViewAutoSizeColumnsMode.None
?好吧,解决了我的问题。显然,将AutoSizeColumnsMode
设置为除None
之外的任何内容都将覆盖对c的任何非用户更改列大小。谢谢你的问题。这让我解决了自己的问题。正确的代码将autosizecolummsmode
语句替换为dgv.AutoResizeColumns()
,现在一切都正常了。您可能希望将其添加为您自己问题的答案,并在等待期结束后接受它,以便阅读本文的其他人能够快速找到类似问题的解决方案。您是否尝试将宽度添加为一个单位,即unit.Parse(widthttoadd.ToString())
?