You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中DataTable填充的DataGridView第7列宽度设置报错求助

解决DataGridView设置列宽时的空引用异常

可能的原因

  • DataTable列数不足:你访问的是索引7的列(即第8列),如果GetPaymentsByProjectId返回的DataTable列数小于8,Columns[7]会返回null,触发空引用异常。
  • AutoGenerateColumns属性禁用:如果dgvShowPaymentsOfProject.AutoGenerateColumns被设为false,DataGridView不会自动根据DataTable创建列,Columns集合为空或数量不足。
  • 执行时机过早:如果在窗体构造函数中执行代码,此时DataGridView还未完成初始化,列还没生成。

解决方案

1. 先验证列数是否足够

在设置列宽前先检查列数,避免索引越界:

DataTable table = projectsOperations.GetPaymentsByProjectId(this.ProjectID);
dgvShowPaymentsOfProject.DataSource = table;

// 先确认目标列存在
if (dgvShowPaymentsOfProject.Columns.Count > 7)
{
    dgvShowPaymentsOfProject.Columns[7].Width = 200;
}
else
{
    // 打印日志确认列数,排查DataTable返回结果
    Debug.WriteLine($"DataTable仅包含{dgvShowPaymentsOfProject.Columns.Count}列,无法访问索引7的列");
}

2. 确保自动生成列启用

检查并设置AutoGenerateColumns为true(默认是true,但如果手动修改过需要恢复):

dgvShowPaymentsOfProject.AutoGenerateColumns = true;
DataTable table = projectsOperations.GetPaymentsByProjectId(this.ProjectID);
dgvShowPaymentsOfProject.DataSource = table;

if (dgvShowPaymentsOfProject.Columns.Count > 7)
{
    dgvShowPaymentsOfProject.Columns[7].Width = 200;
}

3. 绑定完成后再设置列宽

将设置列宽的逻辑放到DataBindingComplete事件中,确保列已完全生成:

private void YourForm_Load(object sender, EventArgs e)
{
    DataTable table = projectsOperations.GetPaymentsByProjectId(this.ProjectID);
    dgvShowPaymentsOfProject.DataSource = table;
}

// 需在设计器中绑定该事件,或手动注册
private void dgvShowPaymentsOfProject_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    if (dgvShowPaymentsOfProject.Columns.Count > 7)
    {
        dgvShowPaymentsOfProject.Columns[7].Width = 200;
    }
}

额外提示

DataGridView的列索引从0开始,Columns[7]对应第8列,确认你要设置的确实是这个位置的列,避免索引混淆。

内容的提问来源于stack exchange,提问作者Ali Mustafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:15:36