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