C# 无法分配datagridview.columns[i].Width属性

C# 无法分配datagridview.columns[i].Width属性,c#,datagridview,resize,C#,Datagridview,Resize,我正在编写一个方法,该方法将调整datagridview中的列的大小,以便所有数据都可见,并且这些列将完全填充datagridview。我正在做的是: 1) 将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据 2) 计算最后一列的右边缘与数据栅格视图的右边缘之间的像素距离 3) 将该距离除以列数。这给了我应该添加到每列的宽度,以完全填充datagridview 4) 将宽度从(3)添加到每列 理论上,这将显示列中的所有数据,并完全填

我正在编写一个方法,该方法将调整datagridview中的列的大小,以便所有数据都可见,并且这些列将完全填充datagridview。我正在做的是:

1) 将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据

2) 计算最后一列的右边缘与数据栅格视图的右边缘之间的像素距离

3) 将该距离除以列数。这给了我应该添加到每列的宽度,以完全填充datagridview

4) 将宽度从(3)添加到每列

理论上,这将显示列中的所有数据,并完全填充datagridview

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())