VB .NET 文本框浅复制到字典

VB .NET Textbox Shallow Copy into Dictionary

虽然有很多关于浅拷贝与深拷贝的问题,但我找不到特定于 VB .NET 中的文本框和字典的问题。我相信我的问题非常独特,值得单独讨论。

在 VB .NET 中,我正在尝试实现一个字典,该字典链接一个名为 PageDisplayFields.DisplayField 的内部 class,它本质上是一个 Enum 到 TextBoxes。键是枚举,值是 System.Web.UI.WebControls.TextBox。我的问题是我希望能够更改字典中 TextBox 的 .Text 并让它也更改最初输入到字典中的 TextBox 的 .Text 属性 。将 TextBox 添加到字典时,它看起来是深拷贝,而不是浅拷贝。对原始文本框或字典中副本的 .Text 属性 的更改不会相互传递。

这是我正在尝试做的代码示例:

Private Shared _TxtBoxLookup As New Dictionary(Of PageDisplayFields.DisplayFields, System.Web.UI.WebControls.TextBox)
Private Sub SetTxtBoxLookup()
    _TxtBoxLookup.Add(PageDisplayFields.DisplayFields.A, txtA)
    _TxtBoxLookup.Add(PageDisplayFields.DisplayFields.B, txtB)
    _TxtBoxLookup.Add(PageDisplayFields.DisplayFields.C, txtC)
    _TxtBoxLookup.Add(PageDisplayFields.DisplayFields.D, txtD)
    _TxtBoxLookup.Add(PageDisplayFields.DisplayFields.E, txtE)
End Sub

SetTxtBoxLookup() 仅在正确的位置调用一次,并且没有任何错误。 _TextBoxLookup 的结构在此调用后永远不会被修改。

If _TxtBoxLookup.ContainsKey(PageDisplayFields.DisplayFields.A) Then
    _TxtBoxLookup.Item(PageDisplayFields.DisplayFields.A).Text = "ThisText"
End If

如果调用此代码,_TxtBoxLookup.Item(PageDisplayFields.DisplayFields.A).Text 实际上设置为 "ThisText"。但是,txtA.Text = ""(默认值)。

同样的,如果我做反向操作,观察到同样的效果:

ModHashTable("A") = _TxtBoxLookup.Item(PageDIsplayFields.DisplayFields.A).Text
'Assume "A" is the correct key to ModHashTable

如果在 TextBox、txtA 中输入“3”,ModHashTable("A") 将设置为“”,因为这仍然是 _TxtBoxLookup.Item(PageDisplayFields.DisplayFields.A ).文本已存储。

如果我通过直接引用文本框来实现存储和检索,一切都按预期工作,所以我 99% 确定我的代码中的问题是文本框不是浅拷贝,而是深拷贝。以这种方式使用字典让我大大减少了许多方法的长度。

有没有办法让字典只存储对文本框的引用?浅拷贝的简单方法?

这很巧妙,但由于 ASP.NET 网页的工作方式,它可能不会像写的那样工作。

每次加载页面时,页面上的所有控件都会从 ViewState 重新创建和填充。因此,在回发之后,您可能仍然有一个共享的 Dictionary 控件……但它们不是当前页面上的控件对象。他们是旧的。

现在,只要您在页面生命周期开始时使用控件重新加载字典,例如在 Page_Load.[=14= 中,您仍然可以进行这项工作]

在任何情况下我都会避免使用共享 Dictionary,因为它将在页面的所有实例之间共享。因此访问同一个页面的两个用户将共享同一个字典,这可能会带来灾难性的后果。