prova a vedere se ti è utile
Io preferisco costruirmi un literal (in questo caso ho semplificato).
Metto in un vettore bidimensionale o in una lista ordinata, e faccio le modifche controllando la rottura della chiave...


codice:
<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim vettore As String(,) = {{"1", "prova1", "c"}, {"1", "prova1", "v"}, {"1", "prova1", "f"}, _
                                    {"2", "prova2", "g"}, {"2", "prova2", "h"}, {"2", "prova2", "p"}, _
                                    {"3", "prova3", "x"}, {"3", "prova3", "y"}, {"3", "prova3", "z"}, {"3", "prova3", "w"} _
                                    }
        Dim chiave As String = ""
        Dim chiave0 As String = ""
        Dim contatore As Integer = 1
        
        Dim sb As New StringBuilder()
        
        '1° record
        chiave0 = vettore(0, 0) & vettore(0, 1)
        sb.Append("record " & contatore & "
")
        sb.Append(vettore(0, 1) & " " & vettore(0, 2))
        sb.Append("
")
        
        'record seguenti
        For i As Integer = 1 To vettore.GetUpperBound(0)
            chiave = vettore(i, 0) & vettore(i, 1)
            If chiave <> chiave0 Then
                contatore += 1
                sb.Append("
")
                sb.Append("record " & contatore & "
")
                chiave0 = chiave
                sb.Append(vettore(i, 1) & " " & vettore(i, 2))
                sb.Append("
")
            Else
                sb.Append(vettore(i, 2))
                sb.Append("
")
                
            End If
        Next
        
        Me.Literal1.Text = sb.ToString
        
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Pagina senza titolo</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>