添加新列后无法访问 DataGridView 列名称
DataGridView column names not accessable after adding new column
我正在尝试向现有数据网格视图添加一列,但在添加一列后出现错误。按名称引用列会引发空引用异常,经过一些调试后我注意到,添加列后列的名称消失了。
在我添加新列之前,您可以在第一张图片中看到,每列都有一个名称。添加一列后,第二张图片显示每列的名称为空。没有更改任何代码,添加到数据网格视图的列是唯一的更改。
DGV_List.Columns("Vendor").Visible = CB_Vendor.Checked
我找到了一两种方法来解决这个问题,例如直接引用像 Me.Vendor.Visible
这样的列。但我很好奇为什么添加新列会导致现有工作代码失败。
编辑添加代码
代码真的很长,所以我将它链接到 pastebin 上。另请注意,该列是手动添加的,而不是使用代码添加的。错误开始时,除了表单设计器代码之外没有任何更改。
添加列后出现空引用错误的代码
添加列之前的表单设计器
添加列后的表单设计
我很确定问题出在“何时”触发了 CheckBox
s 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
我希望这对您有所帮助并且有意义。
我正在尝试向现有数据网格视图添加一列,但在添加一列后出现错误。按名称引用列会引发空引用异常,经过一些调试后我注意到,添加列后列的名称消失了。
在我添加新列之前,您可以在第一张图片中看到,每列都有一个名称。添加一列后,第二张图片显示每列的名称为空。没有更改任何代码,添加到数据网格视图的列是唯一的更改。
DGV_List.Columns("Vendor").Visible = CB_Vendor.Checked
我找到了一两种方法来解决这个问题,例如直接引用像 Me.Vendor.Visible
这样的列。但我很好奇为什么添加新列会导致现有工作代码失败。
编辑添加代码
代码真的很长,所以我将它链接到 pastebin 上。另请注意,该列是手动添加的,而不是使用代码添加的。错误开始时,除了表单设计器代码之外没有任何更改。
添加列后出现空引用错误的代码
添加列之前的表单设计器
添加列后的表单设计
我很确定问题出在“何时”触发了 CheckBox
s 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
我希望这对您有所帮助并且有意义。