2011-10-04 62 views
0

任何人都可以解释为什么下面的代码中的方法1不会改变其他2种方法所在的DataTable?解释为什么DataRow没有改变

这显然是某种引用问题,但为什么呢?

CODE AT IDEONE HERE

Imports System 
Imports System.Data 

Public Class Test 

     Public Shared Sub Main() 
       'Build Table 
       Dim dt as New DataTable 
       dt.Columns.Add("ID",GetType(String)) 
       dt.Columns.Add("Name",GetType(String)) 

       'Populate Table 
       Dim dr as DataRow 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "mike" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "ian" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "rob" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Woman" : dr("Name") = "ann" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Woman" : dr("Name") = "sam" : dt.Rows.Add(dr) 

       output(dt)  'Output Table 

       Dim drFilters() as DataRow = dt.Select("ID='Man'")  'Select all Man 

       'Method 1 does not change dt 
       'dr = dt.NewRow() 
       'dr("ID")="cowman" : dr("Name")="bugle" 
       'drFilters(1)=dr 

       'Method 2 does change dt 
       dr = drFilters(1) 
       dr("ID")="cowman" : dr("Name")="bugle" 

       'Method 3 does change dt 
       'drFilters(1)("ID")="cowman" : drFilters(1)("Name")="bugle" 

       output(dt) 'Output final table 
     End Sub 

     Public Shared Sub output(dt as DataTable) 
       for each dr as DataRow in dt.Rows 
         Console.WriteLine(dr("ID") + vbTab + dr("Name")) 
       Next 
       Console.WriteLine("") 
     End Sub 

End Class 

道歉愚蠢的测试数据:)

回答

2

当你调用drFilters(1)=dr,您更换过滤器回收在DataRow参考,这是从行引用一个单独的集合DataTable本身。 dt.Rows是对DataRow对象的引用列表,与drFilters()一样,但更改一个引用列表中的条目并不会以任何方式影响另一个引用列表。

dt.Rows 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 
3 => dt.Rows(3) 
4 => dt.Rows(4) 

drFilter() 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 

调用drFilters(1)=dr后,收藏这个样子

dt.Rows 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 
3 => dt.Rows(3) 
4 => dt.Rows(4) 

drFilter() 
0 => dt.Rows(0) 
1 => dr 
2 => dt.Rows(2) 

注意dt.Rows保持不变。但是,当您检索对象drFilters(1)并对其进行更改时,您可以直接参考dt.Rows(1),因此对其属性的更改会反映在dt的输出中。

希望这会有所帮助!

+0

+1谢谢,这是一个很好的答案!现在很清楚:) –

+0

很好的答案。我明白它是如何工作的,而且我现在仍然认为我现在更好。 :) – Chris

相关问题