none
Datenliste gruppiert formatiert RRS feed

  • Frage

  • Hallo,

    Als Umsteiger auf ASPX / C# habe ich so meine Anfängerprobleme.

    Mein Ziel:

    Besucherliste in einem Bereich der Webseite darstellen.
    Ob manuell mit Response.Write oder einem Datengrid / Listview etc. ist egal.
    Ideal wäre jeweils eine Lösung.
    Hauptsache eine formatierbare Liste in der angegebenen Form.
    Es kommt mir auf die Gruppierung nach Firma an, nicht auf die Formatierung der Schrift.

    Beispiel:
    *************************************************************
    Daimler
     Ms. White
     Mr. Black
     Mr. Green
     
    CAT
     Ms. Blue
     Ms. Red

    BMW
     Ms. Amber
     Mr. Yellow

    *************************************************************

    Das kommt sinngemäß aus der MSSQL Datenquelle:
    *************************************************************
    "Daimler" "Ms. White"
    "Daimler" "Mr. Black"
    "Daimler" "Mr. Green"
    "CAT" "Ms. Blue"
    "CAT" "Ms. Red"
    "BMW" "Ms. Amber"
    "BMW" "Mr. Yellow"
    *************************************************************

    Wie kann man das am elegantesten in ASPX / C# lösen?

    Ich komme hier zu keinem brauchbaren Ergebnis.

    Danke und Gruß
    Juergen

    juergen.kessler@thomas-magnete.com

     

     

    Donnerstag, 27. Mai 2010 12:04

Antworten

  • Hallo Jürgen,

    Es kommt mir auf die Gruppierung nach Firma an, nicht auf die Formatierung der Schrift.

    Beispiel:
    *************************************************************
    Daimler
     Ms. White
     Mr. Black
     Mr. Green
     
    CAT
     Ms. Blue
     Ms. Red

    BMW
     Ms. Amber
     Mr. Yellow

    das könnte man bspw. mit 2 verschachtelten Repeatern machen. Je nach Menge der Daten kann man diese in einem Rutsch auslesen (bspw. in eine DataTable) und die Ergebnisse dann je nach Gruppe filtern oder man liest zuerst die Gruppen aus (SELECT DISTINCT <Firmenspalte> FROM <Tabelle>) und dann die Namen dazu (SELECT <Name> FROM <Tabelle> WHERE <Firmenspalte> = 'Firmenname')

    *************************************************************
    "Daimler" "Ms. White"
    "Daimler" "Mr. Black"
    "Daimler" "Mr. Green"
    "CAT" "Ms. Blue"
    "CAT" "Ms. Red"
    "BMW" "Ms. Amber"
    "BMW" "Mr. Yellow"
    *************************************************************

    Das kommt sinngemäß aus der MSSQL Datenquelle:


    Die Repeaterdeklaration könnte dann bspw. so aussehen:

    <asp:Repeater ID="Firmen" runat="server">
      <ItemTemplate>
        <b><%# Container.DataItem( "<Firmenspalte>" ) %></b><br />
        <asp:Repeater ID="Namen" runat="server">
          <ItemTemplate>
            <%# Container.DataItem( "<Namensspalte>" ) %><br />
          </ItemTemplate>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>
    

    Im Code füllst Du dann zuerst eine DataTable mit den Firmen und im ItemDataBound Event des Repeaters "Firmen" werden dann jeweils die Namen ausgelesen.

    Das Beispiel ist nur schnell dahingeschrieben und könnte/wird daher ggfs. noch ein paar Fehlerchen enthalten.

    Sub Page_Load( ... ) Handles Me.Load
    
    Dim Firmenliste As DataTable
      Firmenliste = Me.FillDataTable( "SELECT DISTINCT <Firmenspalte> FROM <Tabelle>" )
    
      Firmen.DataSource = Firmenliste
      Firmen.DataBind()
    
    End Sub
    
    Private Sub Firmen_ItemDataBound( ... ) Handles Firmen.ItemDataBound
    
      If e.Item.ItemType <> ListItemType.Item AndAlso e.Item.ItemType <> ListItemType.AlternatingItem Then
        Exit Sub
      End If
    
    Dim SqlStatement As String
    Dim Firmenname  As String
    Dim Namensliste As DataTable
    Dim Namen    As Repeater = CType( e.Item.FindControl( "Namen" ), Repeater )
    
      SqlStatement = "SELECT <Namensspalte> FROM <Tabelle> WHERE <Firmenspalte> = '@SV'"
      Firmenname  = CType( e.Item.DataItem, DataRow )( "<Firmenspalte>" )
      Namensliste = Me.FillDataTable( SqlStatement, Firmenname )
    
      Namen.DataSource = Namensliste
      Namen.DataBind()
    
    End Sub
    
    Private Function FillDataTable( ByVal SqlStatement As String ) As DataTable
      Return FillDataTable( SqlStatement, String.Empty )
    End Function
    
    Private Function FillDataTable( ByVal SqlStatement As String, ByVal SearchValue As String ) As DataTable
    
    Dim ConnectionString As String = "SERVER=127.0.0.1;DATABASE=<DBName>;UID=<Username>;PWD=<Passwort>"
    Dim Connection    As New SqlConnection( ConnectionString )
    Dim Command     As SqlCommand
    Dim DataAdapter   As SqlDataAdapter
    Dim Result      As New DataTable()
      
      Connection.Open()
      Command = Connection.CreateCommand()
      Command.CommandText = SqlStatement
    
      If Not String.IsNullOrEmpty( SearchValue ) Then
        Command.Parameters.AddWithValue( "@SV", SearchValue )
      End if
    
      DataAdapter = New SqlDataAdapter( Command )
      DataAdapter.Fill( Result )
    
      Command.Dispose()
      DataAdapter.Dispose()
    
      Connection.Close()
      Connection.Dispose()
    
      Return Result
    
    End Function
    

    HTH (auch wenn das Beispiel natürlich noch verbesserungswürdig ist :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 27. Mai 2010 14:21
    Moderator
  • Hallo Stefan,

    vielen Dank.
    Das mit den Repeatern kannte ich noch nicht.
    Ich habe es jedoch nach einigem Basteln selbst lösen können:

    ASPX File:

    <div id="Besucher" class="besucher">
    <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource2" Width="206px" Caption="Besucher Heute:" CaptionAlign="Left">
    <ItemStyle Font-Size="small" Wrap="True" />
    <ItemTemplate>
    <!-- Firma nur bei einem Wechsel anzeigen, Function PrintCompany erledigt das -->
    <asp:Label ID="firmaLabel" runat="server" Text='<%# PrintCompany(Eval("firma")) %>' />
    <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
    </ItemTemplate>
    </asp:DataList>
    </div> 

     

    Code behind:

    // Firmenname in der Besucherliste nur bei einem Wechsel der Firma anzeigen

     

    public string PrintCompany(object firma)
    {
     // var i in Class Sitemaster deklariert
     string mycompany = (string)firma;
     string linebreak = "";
     linebreak = i > 0 ?
    "<br />" : "";
     i++;
     if (oldcompany != mycompany)
     {
     oldcompany = mycompany;
     return linebreak + "<b>" + mycompany + "</b><br />";
     }
     else
     {
     return "";
     }
    }
     

    Vielen Dank noch mal für die Antwort.
    Gruß
    Jürgen

     

    Freitag, 28. Mai 2010 10:34

Alle Antworten

  • Hallo Jürgen,

    Es kommt mir auf die Gruppierung nach Firma an, nicht auf die Formatierung der Schrift.

    Beispiel:
    *************************************************************
    Daimler
     Ms. White
     Mr. Black
     Mr. Green
     
    CAT
     Ms. Blue
     Ms. Red

    BMW
     Ms. Amber
     Mr. Yellow

    das könnte man bspw. mit 2 verschachtelten Repeatern machen. Je nach Menge der Daten kann man diese in einem Rutsch auslesen (bspw. in eine DataTable) und die Ergebnisse dann je nach Gruppe filtern oder man liest zuerst die Gruppen aus (SELECT DISTINCT <Firmenspalte> FROM <Tabelle>) und dann die Namen dazu (SELECT <Name> FROM <Tabelle> WHERE <Firmenspalte> = 'Firmenname')

    *************************************************************
    "Daimler" "Ms. White"
    "Daimler" "Mr. Black"
    "Daimler" "Mr. Green"
    "CAT" "Ms. Blue"
    "CAT" "Ms. Red"
    "BMW" "Ms. Amber"
    "BMW" "Mr. Yellow"
    *************************************************************

    Das kommt sinngemäß aus der MSSQL Datenquelle:


    Die Repeaterdeklaration könnte dann bspw. so aussehen:

    <asp:Repeater ID="Firmen" runat="server">
      <ItemTemplate>
        <b><%# Container.DataItem( "<Firmenspalte>" ) %></b><br />
        <asp:Repeater ID="Namen" runat="server">
          <ItemTemplate>
            <%# Container.DataItem( "<Namensspalte>" ) %><br />
          </ItemTemplate>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>
    

    Im Code füllst Du dann zuerst eine DataTable mit den Firmen und im ItemDataBound Event des Repeaters "Firmen" werden dann jeweils die Namen ausgelesen.

    Das Beispiel ist nur schnell dahingeschrieben und könnte/wird daher ggfs. noch ein paar Fehlerchen enthalten.

    Sub Page_Load( ... ) Handles Me.Load
    
    Dim Firmenliste As DataTable
      Firmenliste = Me.FillDataTable( "SELECT DISTINCT <Firmenspalte> FROM <Tabelle>" )
    
      Firmen.DataSource = Firmenliste
      Firmen.DataBind()
    
    End Sub
    
    Private Sub Firmen_ItemDataBound( ... ) Handles Firmen.ItemDataBound
    
      If e.Item.ItemType <> ListItemType.Item AndAlso e.Item.ItemType <> ListItemType.AlternatingItem Then
        Exit Sub
      End If
    
    Dim SqlStatement As String
    Dim Firmenname  As String
    Dim Namensliste As DataTable
    Dim Namen    As Repeater = CType( e.Item.FindControl( "Namen" ), Repeater )
    
      SqlStatement = "SELECT <Namensspalte> FROM <Tabelle> WHERE <Firmenspalte> = '@SV'"
      Firmenname  = CType( e.Item.DataItem, DataRow )( "<Firmenspalte>" )
      Namensliste = Me.FillDataTable( SqlStatement, Firmenname )
    
      Namen.DataSource = Namensliste
      Namen.DataBind()
    
    End Sub
    
    Private Function FillDataTable( ByVal SqlStatement As String ) As DataTable
      Return FillDataTable( SqlStatement, String.Empty )
    End Function
    
    Private Function FillDataTable( ByVal SqlStatement As String, ByVal SearchValue As String ) As DataTable
    
    Dim ConnectionString As String = "SERVER=127.0.0.1;DATABASE=<DBName>;UID=<Username>;PWD=<Passwort>"
    Dim Connection    As New SqlConnection( ConnectionString )
    Dim Command     As SqlCommand
    Dim DataAdapter   As SqlDataAdapter
    Dim Result      As New DataTable()
      
      Connection.Open()
      Command = Connection.CreateCommand()
      Command.CommandText = SqlStatement
    
      If Not String.IsNullOrEmpty( SearchValue ) Then
        Command.Parameters.AddWithValue( "@SV", SearchValue )
      End if
    
      DataAdapter = New SqlDataAdapter( Command )
      DataAdapter.Fill( Result )
    
      Command.Dispose()
      DataAdapter.Dispose()
    
      Connection.Close()
      Connection.Dispose()
    
      Return Result
    
    End Function
    

    HTH (auch wenn das Beispiel natürlich noch verbesserungswürdig ist :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 27. Mai 2010 14:21
    Moderator
  • Hallo Stefan,

    vielen Dank.
    Das mit den Repeatern kannte ich noch nicht.
    Ich habe es jedoch nach einigem Basteln selbst lösen können:

    ASPX File:

    <div id="Besucher" class="besucher">
    <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource2" Width="206px" Caption="Besucher Heute:" CaptionAlign="Left">
    <ItemStyle Font-Size="small" Wrap="True" />
    <ItemTemplate>
    <!-- Firma nur bei einem Wechsel anzeigen, Function PrintCompany erledigt das -->
    <asp:Label ID="firmaLabel" runat="server" Text='<%# PrintCompany(Eval("firma")) %>' />
    <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
    </ItemTemplate>
    </asp:DataList>
    </div> 

     

    Code behind:

    // Firmenname in der Besucherliste nur bei einem Wechsel der Firma anzeigen

     

    public string PrintCompany(object firma)
    {
     // var i in Class Sitemaster deklariert
     string mycompany = (string)firma;
     string linebreak = "";
     linebreak = i > 0 ?
    "<br />" : "";
     i++;
     if (oldcompany != mycompany)
     {
     oldcompany = mycompany;
     return linebreak + "<b>" + mycompany + "</b><br />";
     }
     else
     {
     return "";
     }
    }
     

    Vielen Dank noch mal für die Antwort.
    Gruß
    Jürgen

     

    Freitag, 28. Mai 2010 10:34