2008-12-12 14 views
3

顧名思義,我試圖將數據表中的行分組。爲了進一步詳細說明,該表除了一個字段(列)以外具有相同的行。基本上我試圖做的是把所有不同的領域的相同的行,並把他們在單個領域,同時刪除其他行。在VB中分組數據表的行asp.net 2.0

這裏是我目前正在使用

Dim i As Integer 
    Dim j As Integer 
    For i = 0 To (ds.Tables(0).Rows.Count() - 1) Step 1 
     If (i < ds.Tables(0).Rows.Count()) Then 
      roleHtml = "<table><tr><td>" + ds.Tables(0).Rows(i).Item("roleName") + "</td></tr>" 
      For j = (ds.Tables(0).Rows.Count() - 1) To 0 Step -1 
       If (ds.Tables(0).Rows(i).Item("UserName") = ds.Tables(0).Rows(j).Item("UserName")) And (ds.Tables(0).Rows(i).Item("roleName") IsNot ds.Tables(0).Rows(j).Item("roleName")) Then 
        roleHtml += "<tr><td>" + ds.Tables(0).Rows(j).Item("roleName") + "</td></tr>" 
        ds.Tables(0).Rows.Remove(ds.Tables(0).Rows(j)) 
        i -= 1 
       End If 
      Next j 
      roleHtml += "</table>" 
      ds.Tables(0).Rows(i).Item("roleName") = roleHtml 
     End If 
    Next i 

問題被刪除時,行其指數的變化,基本上領域獲取有什麼用它做另一行拋出的語法。

回答

1

那麼,我可以幫助循環結構。這與您所做的完全不匹配(它使表格完好無損,只是構建了一個大字符串,並且還假設表格按特定方式排序),但它將使用您的實際數據演示經典的控制中斷處理。爲此,表格需要按照用戶和角色進行排序。

Dim i As Integer = 0 
Dim CurUser As String = "" 
Dim CurRole As String = "" 
Dim result As new StringBuilder() 
Dim r as DataRowCollection = ds.Tables(0).Rows 

While i < r.Count 
    'Next User:' 
    CurUser = r(i)("UserName") 
    result.AppendFormat("<h2>{0}</h2>", CurUser).AppendLine() 
    result.AppendLine("<table>") 

    While i < r.Count AndAlso CurUser = r(i)("UserName") 
     'Next Role:' 
     CurRole = r(i)("roleName") 
     result.AppendFormat("<tr><td>{0}</td></tr>", CurRole).AppendLine() 

     While i < r.Count AndAlso CurUser = r(i)("UserName") AndAlso CurRole = r(i)("roleName") 
      i += 1 'Next Record: same user, role ' 
     End While 
     'Finished this role' 
    End While 
    'Finished this user:' 
    result.AppendLine("</table>").AppendLine() 
End While 

這有嵌套循環,而不僅僅是你的兩個。但是,它仍然得到線性性能:它只會遍歷每個記錄一次。它的工作原理是因爲所有的循環共享相同的計數器,只在內部循環中遞增,並且它們都具有相同的基本結束條件。

+0

乾杯隊友將稍後檢查 – Drahcir 2008-12-12 17:05:12

0

我不得不這樣做最近有control-break風格報告類似的東西。

我最終的數據綁定到一箇中繼器控制,其中的項目模板只是一個文字控制。然後,我處理了OnItemDataBound事件,並使代碼與您的模式相似,只要「控件」(在控件中斷的意義上而不是Web控件意義上)的列匹配,只需將剩餘列的值添加到類中-level變量並將e.Item.Visible設置爲false。當它們不再匹配時,我將e.Item.Visible作爲true(默認值),並將文字控件的Text屬性設置爲我正在處理的行所需的html。

我確定有更好的方法可以做到這一點,但用asp.net找到控制中斷報告的信息並不容易:control這個詞在這個領域難以克服時有雙重含義。

+0

請注意,我真的不喜歡我做代碼的方式,即因爲它是一個嵌套循環吸收了很多性能。我想也許這是一個更簡單的解決方案 – Drahcir 2008-12-12 16:10:09

0

這是相當難以閱讀,這通常意味着它已經準備好進行重組位。

你能概述一下你想達到什麼嗎?你想在你的DataTable中留下什麼?

數據是排序還是可以在db中執行?如果它被排序,那麼你只需要一個循環。

我會做到以下幾點:

  • 排序的數據表
  • 爲了使一個新的DataTable你的結果
  • 邁通,保持最近使用的用戶的變量和當前目錄角色。如果用戶名和最後一個不一樣,那麼用你最後一個用戶名和當前的角色列表向你的數據表添加一行。如果用戶名相同,則附加到角色列表。當你到達最後時,不要忘記添加最後一行。

這樣就解決了從正在逐步收集的集合中刪除行的問題。

+0

將上傳一個我想要的成果圖,但目前在工作,不能瀏覽圖像託管網站。 – Drahcir 2008-12-12 16:24:22

0

顯然,我的代碼工作。行i - = 1是額外的。對不起,造成的不便,並感謝您的幫助

+0

如果數據已排序,請檢查我的代碼。它利用這種排序來獲得線性性能,而不是n平方或n log(n)。 – 2008-12-12 17:06:11

0

循環部分看起來像它被覆蓋。

但選擇性的刪除項目(或全部),而循環可以得到討厭快,如果你沒有意識到的伎倆是剛剛從下往上工作(或從最後一個元素到第一,不過還是你想說它)。

這就是問題刪除部分的全部答案。

當你從上次到第一次工作時,刪除編號列表中的項目只會影響已經處理的項目的索引 - 那麼誰在乎呢?

-T。