2008-12-15 64 views
0

我有一张桌子,里面有医生办公室和那些办公室里的医生,我正在接受中继控制。返回的数据不会汇总。所以,如果一个办公室里有两个医生,那么有两排,同一个办公室,不同的医生。转发器控制来汇总数据?

是否有一种方法来聚合数据,以便中继器显示来自该办公室的所有医生的1个办公室,这样我就可以避免重复?

+0

只是要清楚,你想显示办公室的文档数量可用或类似的东西office1 doc1 doc2 doc3类似的东西? – Perpetualcoder 2008-12-15 17:16:26

回答

1

在你的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> 

在后面的代码:

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

我认为你最好在数据库中进行聚合。

0

我正在考虑,但认为可能有更好的方法来做到这一点。

如果在数据库中聚合,传递一个delimeted列并在数据绑定过程中解析它?

0

使用SQL COALESCE函数

由于从SQLTeam.com:

DECLARE @EmployeeList varchar(100) 

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

这将创建一个逗号delimeted员工的名单。你也可以为医生做这个