2012-02-06 94 views
1

是否可以获取DataTable的行索引,以便可以访问上一行和下一行?例如,我有一个包含两列ChapterTitle和PageURL的DataTable。这是一本书的目录。 ChapterTitle是章节名称,PageURL是包含章节(chaptername.html)的HTML页面。当进入本书的一章时,我希望能够分辨出下一章和上一章是哪一章。在DataTable上查找行索引

在找到我目前正在学习的章节后,如何获取下一行和上一行?

ChapterTable.Select("PageURL = '" & PageURL& "'") 
+0

你说你有两列:'ChapterTitle'和'PageURL',但你'重新选择列'ChapterStartPage'。 – 2012-02-06 23:14:21

+0

要么你有你的数据库中的信息,要么你必须解析你的ChapterTitle来找到信息......(提醒:数据库中的行的顺序应该是不相关的,主键是。) – GameAlchemist 2012-02-06 23:42:14

+0

更正了列名 – Aaron 2012-02-07 14:23:52

回答

3
Private Sub LoadDataAndFindRow 
Dim dt As New DataTable() 
dt.Columns.Add("ChapterTitle") 
dt.Columns.Add("PageURL") 

Dim dr As DataRow = dt.NewRow() 
dr(0) = "Aarons Book" 
dr(1) = "www.AaronsBook.com" 
dt.Rows.Add(dr) 

dr = dt.NewRow() 
dr(0) = "Tims Book" 
dr(1) = "www.TimsBook.com" 
dt.Rows.Add(dr) 

dr = dt.NewRow() 
dr(0) = "vincents Book" 
dr(1) = "www.vincentsBook.com" 
dt.Rows.Add(dr) 

dr = dt.NewRow() 
dr(0) = "Xi's Book" 
dr(1) = "www.XisBook.com" 
dt.Rows.Add(dr) 

Dim i As Integer = FindRow(dt, "Tims Book") 
Dim prevRowID As Integer = i - 1 
Dim nextRowID As Integer = i + 1 

End Sub 


Function FindRow(ByVal dt As DataTable, ByVal chapterTitle As String) As Integer 
For i As Integer = 0 To dt.Rows.Count 
If dt.Rows(i)("ChapterTitle") = chapterTitle Then Return i 
Next 
Return -1 
End Function 
+0

有没有办法做到这一点而不使用循环? – Aaron 2012-02-07 17:10:19

+0

我首先尝试在Skip(-1).Take(3)的datatable.AsEnumerable()上使用LINQ,但它花费了太多的时间才能使它工作。另一个想法是在DataTable中有第三个称为RowID的列,然后您可以使用您的问题中所示的.Select方法以及RowID -1或+1,您将知道数据表中的Prev和Next行。 – 2012-02-07 21:37:51

+0

感谢您的建议。 – Aaron 2012-02-08 14:59:06

0

如果设置了dt.Columns.PrimaryKey()当你画了表格,你可以使用findby(PK),如果你设置那么你可以很容易地使用LINQ,只是: “我们将其命名为DataTable中的章节,以保持可读:

dim query = from chapters in dt.AsEnumerable _ 
      where chapters("chapterTitle").equals(<<your criteria>>) _ 
      select chapters 

newDT = iif(chapters.count > 0, chapters.copyToDataTable(), nothing) 

您可以修改或刚拿到chapters.toDataRow..etc。

HTH