提问人:BrightBulb123 提问时间:7/20/2021 最后编辑:BrightBulb123 更新时间:8/9/2021 访问量:226
VB.Net 2010 使用列表作为值从 Dictionary 声明变量时,“对象引用未设置为对象的实例”
VB.Net 2010 "Object reference not set to an instance of an object." when declaring a variable from a Dictionary with a list as the value
问:
这是一个编程的学校项目(不是评估或作业,所以我不是在作弊),我必须制作一个 7 段显示源 1。我决定不走传统方式,手动将每个按钮设置为可见,按下每个按钮以显示一个数字;将相应的数字和要打开的数字作为键值对存储在字典中。我对 Python 有一些了解,所以这就是我的想法。我的表单源 2 有 7 个 (s) 和 10 个 (s)。就像一个实验,因为这是我第一次使用和参与,我决定现在只尝试一下这个数字(并且应该是可见的)。这是我制作的字典:RectangeShape
RectangleShape
RectangleShape
Button
Dictionaries
Lists
VB.net
1
shp4
shp5
Dim Numbers As New Dictionary(Of Integer, List(Of PowerPacks.Shape)) From {{1, New List(Of PowerPacks.Shape) From {shp4, shp5}}, {2, New List(Of PowerPacks.Shape) From {shp2, shp3}}}
以下是按钮 () 的代码:btn1
Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
Dim Thing As PowerPacks.Shape = Numbers(1)(0)
Thing.Visible = True
End Sub
当程序到达 的行时,它会抛出错误。这是一个关于如何解决这个问题的任何想法?Thing.Visible = True
NullReferenceException
Object reference not set to an instance of an object.
来源
来源 1:
来源 2:
答:
编程不是魔术。它的工作方式与您预期的差不多。如果你要摆脱你的内心,那么你必须投入。在发布之前是否使用过调试器?当执行此行时,您是否实际查看了 等的值:Nothing
List
Dictionary
Nothing
shp2
Dim Numbers As New Dictionary(Of Integer, List(Of PowerPacks.Shape)) From {{1, New List(Of PowerPacks.Shape) From {shp4, shp5}}, {2, New List(Of PowerPacks.Shape) From {shp2, shp3}}}
根据您在第二个代码段中对该变量的使用,它必须是成员变量,这意味着第一个代码段位于任何方法之外,这意味着它在类构造函数之前执行,这意味着当时尚未创建任何控件,这意味着引用控件的任何字段都只能是 。如果你在该行上放置了一个断点,并使用了调试器,那么你就会看到这一点。Numbers
Nothing
解决方案是在创建它们之前,不会实际将 添加到集合中。这意味着在调用 .这意味着您可以创建自己的构造函数,并根据需要在那里执行,但您可能应该只在事件处理程序中执行。只需声明变量而不创建对象:Shapes
InitializeComponent
Load
Dictionary
Private numbers As Dictionary(Of Integer, PowerPacks.Shape())
请注意,我提供了一个显式的访问修饰符,您应该始终为所有成员执行此操作,并且还以小写字母开头名称,您可能应该为所有私有字段执行此操作。然后,在事件处理程序中创建对象:load
numbers As New Dictionary(Of Integer, PowerPacks.Shape()) From {{1, {shp4, shp5}},
{2, {shp2, shp3}}}
我冒昧地通过使用数组来简化它,而不是不增加任何价值。Lists
评论
Numbers
Public Class
load
List
List
VB.net
在您的 7 段显示表单上,我将使用一个包含为每个字典键(数字)打开的矩形。这需要首先以编程方式将 7 个形状添加到表单上(看起来您已经对其进行了编码),然后在每个按钮(用于数字)中选择打开的矩形并更改其背景颜色。可能没有必要将所有形状(矩形)“前置”到字典中,因为它们已经手动固定在表单上。如果不是,则拉出将它们放在窗体上的代码,并在窗体加载时首先运行一次。使用这种方法,您不必再担心形状。List (of String)
在表格 1 中,添加:
Dim dicRSBackColor As New Dictionary(Of Integer, List(Of String))
Dim SC As New ShapeContainer
在 Form1_Load 中,添加以下内容:
'define each of the 7 rectangles using, e.g.:
Dim myrec4 As New RectangleShape
myrec4.Name = "shp4"
myrec4.Visible = True
myrec4.BringToFront()
'add locations and size to myrec4
myrec4.Top=100
myrec4.Left=100
myrec4.Width=10
myrec4.Height=100
'then add myrec4 to Shape container
SC.Shapes.Add(myrec4)
'add myrec4 to Form1
Me.Controls.Add(myrec4)
'do the above for all 7 rectangleshapes
'For the dictionary, add number 1's rectangleshape (turned on)
Dim mylist As List(Of String)
mylist.Add("shp4")
mylist.Add("shp5")
dicRSBackColor.Add(1, mylist)
'add number 2 rectangles (turned on)
mylist.Clear()
mylist.Add("shp1")
mylist.Add("shp3")
mylist.Add("shp4")
mylist.Add("shp6")
mylist.Add("shp7")
dicRSBackColor.Add(2, mylist)
'continue until all 7 rec's added
最后,在数字 1 的按钮_Click中,使用以下命令:
'First change background color of all rectangleshapes to Form1's back color
For Each rs As RectangleShape In Me.SC.Shapes
rs.BackColor = Me.BackColor
Next
'Now pull the list of shapes that are turned on for number 1 using the dictionary
Dim mylist1 As List(Of String)
mylist1 = dicRSBackColor(1) 'you're pulling the value for key=1, which is a list of strings
'use a double loop and find out when the list value is the same as the name of the rectangleshape, and then set the back color to orange
For Each item In mylist1
For Each rs As RectangleShape In Me.SC.Shapes
If item = rs.Name Then rs.BackColor = Color.Orange
Next
Next
评论
Lists
List
Shapes