使用StringBuilder的和DataTable,如何在三列返回多行不破时,只有一排? [英] Using StringBuilder and a DataTable, How do I return multiple rows in three columns without breaking when there is only one row?

查看:142
本文介绍了使用StringBuilder的和DataTable,如何在三列返回多行不破时,只有一排?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有从基于称为一个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'的cel​​lpadding ='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'的cel​​lpadding ='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< D​​ataRow的方式>()采取(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆