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

DataGridView column names not accessable after adding new column

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

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

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

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

编辑添加代码

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

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

https://pastebin.com/inZCT27A

添加列之前的表单设计器

https://pastebin.com/2nv33pA3

添加列后的表单设计

https://pastebin.com/7ULHpNwE

我很确定问题出在“何时”触发了 CheckBoxs CheckedChanged 事件。

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

如果在设计器中将复选框设置为 False,那么它的 CheckedChanged 事件将不会在 InitializeComponent 方法中触发。

因为复选框在设计器中设置为 true,然后在 InitializeComponent 方法中的“某个时候”,CheckChanged 事件将被触发,当它触发时......你可以不保证网格已完全初始化。

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

要点是,因为您确实想在复选框的 CheckChanged 事件中引用网格,并且您确实希望最初选中该复选框,那么您需要在将复选框设置为 True/False (checked/unchecked).

之前,确保网格已完全初始化

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

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

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

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