2008-12-15 10 views
0

J'ai une table avec les bureaux de médecins et les médecins dans les bureaux que je suis en train de remplir à un contrôle de répéteur. Les données qui reviennent ne sont pas agrégées. Donc, s'il y a 2 médecins dans 1 bureau, il y a 2 rangées, même bureau, docteur différent.Contrôle répéteur pour agréger des données?

Existe-t-il un moyen d'agréger les données afin que le répéteur montre 1 bureau avec tous les médecins de ce bureau afin que je puisse éviter la duplication?

+0

Pour être clair, voulez-vous montrer des bureaux avec le nombre de docs disponibles ou quelque chose comme office1 doc1 doc2 doc3 quelque chose comme ça? – Perpetualcoder

Répondre

1

Dans votre balisage ASPX:

<table><tr><th>Office</th><th>Doctors</th></tr> 
<asp:repeater id="Repeater" runat="server" OnItemDataBound="NextItem" ... > 
    <ItemTemplate><asp:Literal id="RepeaterRow" runat="server" /> 
    </ItemTemplate> 
</asp:repeater> 
<asp:Literal id="LastRow" runat="server" /> 
</table> 

Dans votre code derrière:

public class Office 
{ 
    public string OfficeName {get;set;}; 
    List<string> _doctors = new List<string>(); 
    public List<string> Doctors {get{ return _doctors; } }; 

    void Clear() 
    { 
     OfficeName = ""; 
     _doctors.Clear(); 
    } 

    public override string ToString() 
    { 
     StringBuilder result = new StringBuilder("<tr>"); 

     result.AppendFormat("<td>{0}</td>", OfficeName); 

     string delimiter = ""; 
     result.Append("<td>"); 
     foreach(string doctor in Doctors) 
     { 
      result.Append(doctor).Append(delimiter); 
      delimiter = "<br/>"; 
     } 

     result.Append("</td></tr>"); 

     return result.ToString(); 
    } 
} 

.

private string CurOffice = ""; 
private Office CurRecord = new Office(); 

void NextItem(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return; 

    Literal repeaterRow = e.Item.FindControl("RepeaterRow") as Literal; 
    if (repeaterRow == null) return; 

    DataRow row = ((DataRowView)e.Item.DataItem).Row; 

    if (CurOffice != (string)row["Office"]) 
    { 
     repeaterRow.Text = CurRecord.ToString(); 
     repeaterRow.Visible = true; 

     CurRecord.Clear(); 
     CurOffice = row["Office"]; 
     CurRecord.Office = CurOffice; 
    } 
    else 
     e.Item.Visible = false; 

    CurRecord.Doctors.Add((string)row["doctor"]); 
} 

void Page_PreRender(object sender, EventArgs e) 
{ 
    LastRow.Text = CurRecord.ToString(); 
} 
0

Je pense que vous feriez mieux de faire l'agrégation dans la base de données.

0

Je considérais cela, mais je pensais qu'il pourrait y avoir une façon plus chic de le faire.

Si vous agrégez dans la base de données, passez une colonne délimitée et analysez-la lors de la liaison de données?

0

Utilisez la fonction coalesce SQL

A partir SQLTeam.com:

DECLARE @EmployeeList varchar(100) 

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
     CAST(Emp_UniqueID AS varchar(5)) 
FROM SalesCallsEmployees 
WHERE SalCal_UniqueID = 1 

Cela va créer une liste delimeted par des virgules des employés. Vous pouvez le faire pour les médecins aussi

Questions connexes