簡體   English   中英

使用StringBuilder和DataTable,當只有一行時,如何在不中斷的情況下返回三列中的多行?

[英]Using StringBuilder and a DataTable, How do I return multiple rows in three columns without breaking when there is only one row?

我有一個函數,該函數根據調用的ID從SQL存儲的Proc返回電子郵件地址列表。 它使用StringBuilder並返回一列。 對於大多數ID,電子郵件地址為4個或更少,這種格式很好。 但是,我們現在獲得了更多具有10多個電子郵件地址的ID,這使頁面過長。

該函數是:

DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);
StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");
for (int i = 0; i < dt.Rows.Count; i++)
{
    sb.Append("<tr><td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    sb.Append("</td></tr>");
}
sb.Append("</table>");
return sb.ToString();

我嘗試使用以下內容,但是在返回的地址太少時會中斷:

DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);
StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");
for (int i = 0; i < dt.Rows.Count; i++)
{
    sb.Append("<tr><td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    i++;
    sb.Append("</td>");
    sb.Append("<td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    i++;
    sb.Append("</td>");
    sb.Append("<td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    i++;
    sb.Append("</td></tr>");
}
sb.Append("</table>");
return sb.ToString();

使用Linq的Take函數,您可以從第一個示例中替換以下代碼塊:

for (int i = 0; i < dt.Rows.Count; i++)
{
    sb.Append("<tr><td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    sb.Append("</td></tr>");
}

有了這個:

foreach (var row in dt.Rows.OfType<DataRow>().Take(3))
{
    sb.Append("<tr><td>");
    sb.Append(row["EMail"].ToString());
    sb.Append("</td></tr>");
}

由於Take從序列的開頭最多返回指定數量的元素,因此該代碼塊將在0到3次之間任意運行。 您最多將顯示3個地址(即使存在更多地址),如果少於3個,則不會獲得IndexOutOfRangeException


更新:與ASP.NET 2.0兼容

由於您不能使用Linq,因此結果應相同:

for (int i = 0; i < (dt.Rows.Count > 3 ? 3 : dt.Rows.Count); i++)
{
    sb.Append("<tr><td>");
    sb.Append(dt.Rows[i]["EMail"].ToString());
    sb.Append("</td></tr>");
}

表達式dt.Rows.Count > 3 ? 3 : dt.Rows.Count dt.Rows.Count > 3 ? 3 : dt.Rows.Count使用? 運算符使for循環遍歷所有電子郵件地址,除非有3個以上,否則將僅循環3次。

您可以考慮使用asp.net轉發器控件,而不是使用字符串生成器構建html表。 您可以將DataTable直接綁定到轉發器,然后從html設計圖面控制html。 對於您想做的事情,它將被證明更加靈活。 這是假設您正在使用asp.net。

另請參閱我關於創建自定義asp.net控件的文章,因為這將為您提供最大的靈活性並封裝您的自定義html邏輯。

請享用!

我認為Doug走在正確的軌道上,但是如果您堅持使用StringBuilder和for循環來做到這一點,請嘗試以下操作:

DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);

StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");

string rowFormat = "<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>";

for (int i = 0; i < dt.Rows.Count; i+=3)
{
    string[] rowEmails = { String.Empty, String.Empty, String.Empty };

    for (int j = 0; j < 3; j++)
    {
        if (i+j < dt.Rows.Count) rowEmails[j] = dt.Rows[i+j]["Email"].ToString();
    }

    sb.AppendFormat(rowFormat, rowEmails[0], rowEmails[1], rowEmails[2]);
}

sb.Append("</table>");

return sb.ToString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM