Vb.net 如何创建仅在需要时修改的列表引用?
我有两个Vb.net 如何创建仅在需要时修改的列表引用?,vb.net,list,winforms,Vb.net,List,Winforms,我有两个WinForms。在一个WinForm中,我创建了一个类对象的列表(称为问题)。我正试图将该列表复制到使用.ShowDialog调用的模式对话框窗体中。请参阅下面的相关部分 Public Class frmNewGame Friend lstQuestions As New List(Of Question) .... Private Sub btnConfigAdv_Click(sender As Object, e As EventArgs) Handles btnConfigA
WinForms
。在一个WinForm中,我创建了一个类对象的列表
(称为问题
)。我正试图将该列表复制到使用.ShowDialog
调用的模式对话框窗体中。请参阅下面的相关部分
Public Class frmNewGame
Friend lstQuestions As New List(Of Question)
....
Private Sub btnConfigAdv_Click(sender As Object, e As EventArgs) Handles btnConfigAdv.Click
Using frmStackConfig As New frmAdvancedStack
frmStackConfig.lstStackQuestions = lstQuestions
If frmStackConfig.ShowDialog() = DialogResult.OK Then
' We OK'd the Dialog Window, so now make that form's lstQuestions, THIS form's list of questions.
' Additionally, recount and redraw the stats.
lstQuestions = frmStackConfig.lstStackQuestions
End If
End Using
End Sub
....
End Class
正如你所看到的,我正试图复制主要内容。在现在的对话框FORMfrmStackConfig
中,我有关于应该修改该表单列表副本的代码:
lstStackQuestions(dgvQuestions.SelectedRows(0).Cells("dgcQuestionCount").Value).QuestionID = frmFindQuestion.intQuestionNumber
在表单的前半部分,仅当对话框表单捕获到DialogResult.OK
时,才应复制/修改应修改主表单列表的代码。但是,即使发送了对话框result.Cancel
,主窗体的列表似乎也会被修改
我发现一个问题/答案似乎为我指明了正确的方向,即使用列表副本进行引用,而不是修改主表单:我尝试用它做以下操作:
For Each item In lstQuestions
frmStackConfig.lstStackQuestions.Add(item)
Next
此外,我尝试了.AddRange
和.CopyTo
但得到了相同的结果。即使在调用DialogResult.None
或DialogResult.Cancel
时,主窗体仍在提取和复制模式窗体的列表副本。理想的结果应该是,只有当父窗体捕获到一个对话框result.OK
我应该如何对列表进行引用,以确保它不会被子表单修改?如果需要对象的副本,则必须实际创建该对象的副本。如果您没有在任何地方创建新的
列表(问题)
对象的代码,那么您就不会创建副本。最简单的选择是只需调用ToList
:
Dim copy=original.ToList()
另一个选项是显式创建新列表,然后填充它:
Dim副本作为新列表(问题)
副本.添加范围(原件)
如果您想要对象的副本,那么您必须实际创建该对象的副本。如果您没有在任何地方创建新的列表(问题)
对象的代码,那么您就不会创建副本。最简单的选择是只需调用ToList
:
Dim copy=original.ToList()
另一个选项是显式创建新列表,然后填充它:
Dim副本作为新列表(问题)
副本.添加范围(原件)
类是参考类型。查看Dim a=New MyClass()
然后查看Dim b=a
;a
和b
都指向同一个对象实例。您可能想要实现。(例如通过实现接口。)@RezaAghaei谢谢,但我希望在VB.NET中得到一些东西。但是我花了一分钟的时间,但是我在MSDN上找到了这个VB方法的“原始”文档:类是引用类型。查看Dim a=New MyClass()
然后查看Dim b=a
;a
和b
都指向同一个对象实例。您可能想要实现。(例如通过实现接口。)@RezaAghaei谢谢,但我希望在VB.NET中得到一些东西。但这花了我一分钟的时间,但我在MSDN上找到了此VB方法的“原始”文档: