Index屬性返回當(dāng)前行在視圖(DataView、View)中序列位置。這個也僅對我們看到的顯示到表中的實際順序有意義。所以請注意,千萬不要在內(nèi)存表中使用此屬性,這就不是為內(nèi)存表設(shè)計的。這里的Index跟表中顯示的行號是相對應(yīng)的。因為行號是從1開始的,而Index的序列是從0開始的,所以表中的行號=Index+1。
備注:什么叫內(nèi)存表?就是我們直接通過Database.ExecuteDataTableHelp方法返回的DataTableHelp對象,如果沒有綁定到SmGrid控件中就算內(nèi)存表。
Index屬性本身在DataRow中并不存在,是我們強(qiáng)行擴(kuò)展添加出來的。實現(xiàn)的原理如下,我們在DataTableHelp對象中添加一個HaveUpdatedDataRowIndex屬性,標(biāo)記當(dāng)前表的視圖是否有變更,如果一旦有變更,就將HaveUpdatedDataRowIndex屬性標(biāo)記為False。這樣,每次我們訪問Index屬性時都會去檢測這個屬性是否為False,如果是False就會去主動執(zhí)行一下DataTableHelp的UpdateDataRowIndex方法,然后將HaveUpdatedDataRowIndex屬性恢復(fù)為True。我們只需要在影響視圖結(jié)果的數(shù)據(jù)加載、重新排序、排序列數(shù)據(jù)變更、上移、下移數(shù)據(jù)行時及時變更HaveUpdatedDataRowIndex屬性為False即可。
鑒于上面的原理。如果我們在需要批量重復(fù)使用此Index屬性時,可以考慮行執(zhí)行一下DataTableHelp的UpdateDataRowIndex方法,防止系統(tǒng)因為什么原因遺漏了狀態(tài)修改而導(dǎo)致程序運行結(jié)果不正確。
由這個Index屬性我們引申了兩個屬性,NextRow和PreviousRow。同時也引申了兩個函數(shù)NextRowData和PreviousRowData。
NextRow:返回當(dāng)前行的后一行。如果當(dāng)前行已經(jīng)為最后一行,則此屬性會返回空值。此屬性只適合配合SmGrid表使用。在純后臺場景下會一直返回空值。
PreviousRow:返回當(dāng)前行的前一行。如果當(dāng)前行已經(jīng)為第一行,則此屬性會返回空值。此屬性只適合配合SmGrid表使用。在純后臺場景下會一直返回空值。
NextRowData:返回后一行指定列的值。如果對應(yīng)的NewRow為空的話則返回DBNull.Value。
PreviousRowData:返回前一行指定列的值。如果對應(yīng)的PreviousRow為空的話則返回DBNull.Value。
既然引入了兩個屬性,為什么還要費事地再引入功能差不多的兩個方法呢?這是因為引入的兩個方法可以解決一些獲取數(shù)據(jù)失敗的情況。這樣我們就可以在“表達(dá)公式”中使用這兩個方法來實現(xiàn)類似Excel中的公式那樣跨行引用,進(jìn)而實現(xiàn)流水賬式的數(shù)據(jù)統(tǒng)計。詳細(xì)的使用可以參考“流水賬”的介紹。