提问人:pball 提问时间:7/30/2020 最后编辑:pball 更新时间:8/1/2020 访问量:269
添加新列后无法访问 DataGridView 列名
DataGridView column names not accessable after adding new column
问:
我正在尝试将列添加到现有数据网格视图,但在添加列后出现错误。按其名称引用列会引发空引用异常,经过一些调试,我注意到,添加列后列的名称消失了。
在我添加新列之前,您可以在第一张图片中看到,每列都有一个名称。添加列后,第二张图像显示每列的名称为空。未更改任何代码,添加到数据网格视图的列是唯一的更改。
DGV_List.Columns("Vendor").Visible = CB_Vendor.Checked
我已经找到了一两种方法来解决这个问题,例如直接引用列,例如.但我很好奇为什么添加新列会导致现有工作代码失败。Me.Vendor.Visible
编辑添加代码
代码真的很长,所以我把它链接到pastebin上。另请注意,该列是手动添加的,而不是使用代码添加的。错误开始时,除了窗体设计器代码之外,没有其他任何更改。
添加列后出现空引用错误的代码
添加列前的表单设计器
添加列后的表单设计
答:
我很确定问题出在“何时”触发 s 事件。CheckBox
CheckedChanged
如果在设计器中将复选框设置为,则其事件将在方法中“触发一次”。True
CheckedChanged
InitializeComponent
如果在设计器中设置了该复选框,则不会在方法中触发其事件。False
CheckedChanged
InitializeComponent
由于该复选框在设计器中设置为 true,因此在方法中“某个时间”事件将被触发,当它触发时......您不能保证网格已完全初始化。InitializeComponent
CheckChanged
在网格完全初始化之前检查与网格相关的“任何内容”是有风险的。这很容易解释一些不一致的地方,我相信你已经看到了。
要点是,由于您确实希望在复选框出现时引用网格,并且您确实希望最初选中该复选框,因此您需要确保网格在“之前”完全初始化复选框(选中/取消选中)。CheckChanged
True/False
一种方法是在“设计器”中,取消选中引用网格的复选框。这将防止在网格可能未完全初始化时在方法中触发事件。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
我希望这有帮助并且有意义。
评论