绑定数据源后单独设置DataGridView各列宽度的问题
解决方案
PowerShell 修改方案
核心思路
必须在绑定数据源之后操作列(绑定前列未生成,会触发找不到属性的异常),对目标列关闭自动调整逻辑后设置固定宽度,其余列保留自动调整规则。
修改后的代码片段
# 初始化DataGridView原有代码 $script:dataGridView1 = New-Object System.Windows.Forms.DataGridView; $script:dataGridView1.Name = 'dataGridView1'; $script:dataGridView1.Size = '1235, 450'; $script:dataGridView1.RowTemplate.DefaultCellStyle.ForeColor = '#000088'; $script:dataGridView1.ReadOnly = $True; $script:dataGridView1.AllowUserToDeleteRows = $False; $script:dataGridView1.RowHeadersVisible = $False; $script:dataGridView1.TabIndex = 3; # 设置全局自动调整模式(替换原16即Fill模式,需保留Fill可看下方备注) $script:dataGridView1.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::AllCellsExceptHeader; $script:dataGridView1.AllowUserToAddRows = $False; $script:dataGridView1.ColumnHeadersHeightSizeMode = 2; $script:dataGridView1.Location = '13, 87'; $script:dataGridView1.AllowUserToOrderColumns = $True; # 绑定数据源(必须在列操作之前执行) $script:dataGridView1.DataSource = $script:AWtable1; $script:dataGridView1.Anchor = (4, 8, 1); $script:dataGridView1.DataBindings.DefaultDataSourceUpdateMode = 0; # 操作特定列:示例设置名为"ID"的列宽度为80 $targetColumn = $script:dataGridView1.Columns["ID"] if ($targetColumn) { # 关闭该列自动调整,才能设置固定宽度 $targetColumn.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::None $targetColumn.Width = 80 } else { Write-Warning "指定的目标列不存在,请检查列名" } # 备注:若需保留全局Fill模式(原代码的16),仅修改目标列即可,其余列自动填充剩余空间 # $script:dataGridView1.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill # 绑定数据源后再设置目标列的AutoSizeMode为None和Width
C# 实现方案
代码示例
using System.Windows.Forms; using System.Drawing; // 初始化DataGridView DataGridView dataGridView1 = new DataGridView(); dataGridView1.Name = "dataGridView1"; dataGridView1.Size = new Size(1235, 450); dataGridView1.RowTemplate.DefaultCellStyle.ForeColor = Color.FromArgb(0, 0, 136); dataGridView1.ReadOnly = true; dataGridView1.AllowUserToDeleteRows = false; dataGridView1.RowHeadersVisible = false; dataGridView1.TabIndex = 3; // 设置全局自动调整模式 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader; dataGridView1.AllowUserToAddRows = false; dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dataGridView1.Location = new Point(13, 87); dataGridView1.AllowUserToOrderColumns = true; // 绑定数据源 dataGridView1.DataSource = AWtable1; dataGridView1.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; dataGridView1.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never; // 设置特定列宽度:示例为列名为"ID"的列 DataGridViewColumn targetColumn = dataGridView1.Columns["ID"]; if (targetColumn != null) { targetColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; targetColumn.Width = 80; } // 若需全局Fill模式,替换AutoSizeColumnsMode为Fill即可 // dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
异常原因说明
出现The property "AutoSizeMode/Width" cannot be found on this object.异常的核心原因:
- 操作时机错误:在绑定数据源前尝试访问列,此时DataGridView尚未根据数据源生成列集合,引用的列对象为空。
- 列标识错误:指定的列名/索引不存在,导致无法找到对应列对象,进而无法访问属性。
内容的提问来源于stack exchange,提问作者Icoryx
相关产品推荐
相关产品推荐

