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

时间:2015-03-19 15:41:40

标签: asp.net vb.net dictionary textbox shallow-copy

虽然有很多关于浅拷贝和深拷贝的问题,但我找不到一个特定于VB .NET中的TextBoxes和Dictionaries。我相信我的问题非常独特,值得拥有它自己的主题。

在VB .NET中,我试图实现一个字典,该字典链接一个名为PageDisplayFields.DisplayField的内部类,它本质上是一个Enum到TextBoxes。键是Enum,值是System.Web.UI.WebControls.TextBox。我的问题是,我希望能够更改字典中TextBox的.Text并让它更改最初输入到Dictionary中的TextBox的.Text属性。将TextBox添加到字典时,它似乎是深拷贝,而不是浅拷贝。对原始TextBox或Dictionary中的副本的.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中输入“3”,则txtA,ModHashTable(“A”)将被设置为“”,因为它仍然是_TxtBoxLookup.Item(PageDisplayFields.DisplayFields.A).Text存储的值。 / p>

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

有没有办法让Dictionary存储只引用TextBoxes?一个简单的浅层复制方法?

1 个答案:

答案 0 :(得分:0)

这是巧妙的,但由于ASP.NET网页的工作原理,它可能无法正常工作。

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

现在,只要您在页面生命周期开始时使用控件重新加载字典,就可以完成此工作,例如在Page_Load中。

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