使用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返回电子邮件地址的列表的功能。它是使用StringBuilder的,并返回一列。对于大多数的ID有4个或更少的电子邮件地址和该格式是罚款。但是,我们现在变得更加的ID与10+的电子邮件地址,这是使页面太长。
功能是:
DataTable的DT = DAL.ExecStoredProc(DAL.DatabaseName.DB,storedProc,参数);
StringBuilder的SB =新的StringBuilder();
sb.Append(< BR />< BR />中);
sb.Append(<表格边框='0'的cellpadding ='3'>中);
的for(int i = 0; I< dt.Rows.Count;我++)
{
sb.Append(&所述; TR>&下; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
sb.Append(&下; / TD>&下; / TR>中);
}
sb.Append(< /表>);
返回sb.ToString();
我已经用下面的尝试,但在有返回太少地址,它打破了:
DataTable的DT = DAL.ExecStoredProc(DAL.DatabaseName.DB,storedProc,参数);
StringBuilder的SB =新的StringBuilder();
sb.Append(< BR />< BR />中);
sb.Append(<表格边框='0'的cellpadding ='3'>中);
的for(int i = 0; I< dt.Rows.Count;我++)
{
sb.Append(&所述; TR>&下; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
我++;
sb.Append(&下; / TD>中);
sb.Append(&所述; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
我++;
sb.Append(&下; / TD>中);
sb.Append(&所述; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
我++;
sb.Append(&下; / TD>&下; / TR>中);
}
sb.Append(< /表>);
返回sb.ToString();
使用LINQ的 以
功能,你可以从你的第一个例子替换code以下块:
的for(int i = 0; I< dt.Rows.Count;我++)
{
sb.Append(&所述; TR>&下; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
sb.Append(&下; / TD>&下; / TR>中);
}
本:
的foreach(VAR行dt.Rows.OfType< DataRow的方式>()采取(3))
{
sb.Append(&所述; TR>&下; TD>中);
sb.Append(行[电子邮件]的ToString());
sb.Append(&下; / TD>&下; / TR>中);
}
由于采取的回报到指定从序列的开始元素的个数,code这个块将任何地方从0到3次运行。你最多有3显示的地址(即使是多present),你不会得到的 IndexOutOfRangeException
如果你有小于3。
更新:ASP.NET 2.0兼容
既然你不能使用LINQ的,这应该有同样的结果:
的for(int i = 0;我≤(dt.Rows.Count→3?3:dt.Rows.Count);我++)
{
sb.Append(&所述; TR>&下; TD>中);
sb.Append(dt.Rows [I] [电子邮件]的ToString());
sb.Append(&下; / TD>&下; / TR>中);
}
这位前pression dt.Rows.Count> 3? 3:dt.Rows.Count
使用的 ?
运营商引起为
循环遍历所有的电子邮件地址除非有超过3个,在这种情况下,将迭代仅3次。
I have a function that returns a list of email addresses from a SQL stored Proc based on an ID called. It is using StringBuilder and returns one column. For most IDs there are 4 or less email addresses and this format is fine. However we are now getting more IDs with 10+ email addresses and this is making the page too long.
The function is:
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();
I have tried using the following but it breaks when there are too few addresses to return:
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();
Using Linq's Take
function, you could replace the following block of code from your first example:
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
with this:
foreach (var row in dt.Rows.OfType<DataRow>().Take(3))
{
sb.Append("<tr><td>");
sb.Append(row["EMail"].ToString());
sb.Append("</td></tr>");
}
Since Take returns up to the specified number of elements from the beginning of the sequence, this block of code will be run anywhere from 0 to 3 times. You'll have 3 addresses displayed at most (even if more are present), and you won't get an IndexOutOfRangeException
if you have less than 3.
UPDATE: ASP.NET 2.0 Compatible
Since you can't use Linq, this should have the same result:
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>");
}
The expression dt.Rows.Count > 3 ? 3 : dt.Rows.Count
uses the ?
operator to cause the for
loop to iterate over all of the email addresses unless there are more than 3, in which case it will iterate only 3 times.
这篇关于使用StringBuilder的和DataTable,如何在三列返回多行不破时,只有一排?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!