添加新列后无法访问 DataGridView 列名

DataGridView column names not accessable after adding new column

提问人:pball 提问时间:7/30/2020 最后编辑:pball 更新时间:8/1/2020 访问量:269

问:

我正在尝试将列添加到现有数据网格视图,但在添加列后出现错误。按其名称引用列会引发空引用异常,经过一些调试,我注意到,添加列后列的名称消失了。

在我添加新列之前,您可以在第一张图片中看到,每列都有一个名称。添加列后,第二张图像显示每列的名称为空。未更改任何代码,添加到数据网格视图的列是唯一的更改。

DGV_List.Columns("Vendor").Visible = CB_Vendor.Checked

Normal operation Error after adding column

我已经找到了一两种方法来解决这个问题,例如直接引用列,例如.但我很好奇为什么添加新列会导致现有工作代码失败。Me.Vendor.Visible

编辑添加代码

代码真的很长,所以我把它链接到pastebin上。另请注意,该列是手动添加的,而不是使用代码添加的。错误开始时,除了窗体设计器代码之外,没有其他任何更改。

添加列后出现空引用错误的代码

https://pastebin.com/inZCT27A

添加列前的表单设计器

https://pastebin.com/2nv33pA3

添加列后的表单设计

https://pastebin.com/7ULHpNwE

vb.net NullReferenceException DataGridViewColumn

评论

0赞 Jimi 7/30/2020
发布您使用的代码,而不是这些图像。
0赞 JohnG 7/31/2020
您的评论...“但我很好奇为什么添加新列会导致现有的工作代码失败。...它不会。简单地按照您的状态添加一列不会导致其他列名称消失。这两张照片无异于向我们展示一张车祸的“前/后”图片,然后问我们......“为什么会撞车。”一定有其他事情(你没有展示)在发生。如果这种情况发生在“添加”列之后,我建议显示该代码,否则你将得到的只是猜测。
0赞 pball 8/1/2020
我应该包括引发错误的代码部分还是表单设计器中的代码?窗体设计器是从问题之前到问题之后更改的唯一代码。此外,该列是手动添加到窗体中的,而不是使用代码。

答:

1赞 JohnG 8/1/2020 #1

我很确定问题出在“何时”触发 s 事件。CheckBoxCheckedChanged

如果在设计器中将复选框设置为,则其事件将在方法中“触发一次”。TrueCheckedChangedInitializeComponent

如果在设计器中设置了该复选框,则不会在方法中触发其事件。FalseCheckedChangedInitializeComponent

由于该复选框在设计器中设置为 true,因此在方法中“某个时间”事件将被触发,当它触发时......您不能保证网格已完全初始化。InitializeComponentCheckChanged

在网格完全初始化之前检查与网格相关的“任何内容”是有风险的。这很容易解释一些不一致的地方,我相信你已经看到了。

要点是,由于您确实希望在复选框出现时引用网格,并且您确实希望最初选中该复选框,因此您需要确保网格在“之前”完全初始化复选框(选中/取消选中)。CheckChangedTrue/False

一种方法是在“设计器”中,取消选中引用网格的复选框。这将防止在网格可能未完全初始化时在方法中触发事件。CheckedChangedInitializeComponent

然后在表单事件中,我们几乎可以保证网格已完全初始化,将复选框状态设置为选中。然后,事件可以无误地触发。...LoadCheckedChanged

Private Sub MCRI_Checker_Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  CB_Description.Checked = True
  CB_Drawing.Checked = True
  CB_FilePath.Checked = True
  CB_Quantity.Checked = True
  CB_ReqType.Checked = True
  CB_Vendor.Checked = True
  CB_WhereUsed.Checked = True
End Sub

我希望这有帮助并且有意义。