Benutzer mit den meisten Antworten
Datenliste gruppiert formatiert

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. RedBMW
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ß
Juergenjuergen.kessler@thomas-magnete.com
Antworten
-
Hallo Jürgen,
Es kommt mir auf die Gruppierung nach Firma an, nicht auf die Formatierung der Schrift.
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')Beispiel:
*************************************************************
Daimler
Ms. White
Mr. Black
Mr. Green
CAT
Ms. Blue
Ms. RedBMW
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"
*************************************************************
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- Als Antwort vorgeschlagen Thorsten DörflerEditor Donnerstag, 27. Mai 2010 19:29
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 1. Juni 2010 11:46
-
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
{
// 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- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 1. Juni 2010 11:46
Alle Antworten
-
Hallo Jürgen,
Es kommt mir auf die Gruppierung nach Firma an, nicht auf die Formatierung der Schrift.
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')Beispiel:
*************************************************************
Daimler
Ms. White
Mr. Black
Mr. Green
CAT
Ms. Blue
Ms. RedBMW
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"
*************************************************************
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- Als Antwort vorgeschlagen Thorsten DörflerEditor Donnerstag, 27. Mai 2010 19:29
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 1. Juni 2010 11:46
-
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
{
// 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- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 1. Juni 2010 11:46