2

我的类库中有一个类,该类具有一个方法,该方法使用带有 a 的列表 SqlDataReader来循环浏览所有记录。

public List<myDetails> GetAddressDetails(int id)
{
    List<myDetails> mydetails = new List<myDetails>();
    myDetails details;

    try
    {
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                details = new myDetails((
                    reader.GetString(reader.GetOrdinal("FieldName")));

                mydetails.Add(details);
        }
        rdr.Close();
        return mydetails;
    }
}

我正在尝试使用 aStringBuilder来构建一个 HTML 表,但无法弄清楚如何正确循环遍历我的列表集合。我尝试了几个不同的 for 循环,但它们没有给出正确的结果。

    var item = clib.GetAddressDetails(Convert.ToInt32(Session["mysession"]));

        if (item != null)
        {      
            StringBuilder htmlStr = new StringBuilder("");
            htmlStr.Append("<center><h2 class='headings'>Addresses</h2>");
            htmlStr.Append("<table border='1' cellpadding='3'>");

foreach (var detail in item)
{
            htmlStr.Append("<tr>");
            htmlStr.Append("<td width='25px'>" + item.FieldName + "</td><tr>");
            htmlStr.Append("</tr>");
            htmlStr.Append("</table></center><br/>");
            divAddresses.InnerHtml = htmlStr.ToString();   
    }


        }
4

2 回答 2

3

您需要使用循环。foreach一个简单的foror循环while将起作用:

// initialize the string builder outside the loop!
StringBuilder htmlStr = new StringBuilder("");

// build out the header outside the loop..
htmlStr.Append("<center><h2 class='headings'>Addresses</h2>");
htmlStr.Append("<table border='1' cellpadding='3'>");

// retrieve the id from the session
int id = Convert.ToInt32(Session["mysession"]);

// then loop over the items returned
foreach(var item in clib.GetAddressDetails(id))
{
    if (item != null)
    {                                       
        htmlStr.Append("<tr>");
        htmlStr.Append("<td width='25px'>" + item.FieldName + "</td><tr>");
        htmlStr.Append("</tr>");
    }
}

// finish building your table outside the loop..
htmlStr.Append("</table></center><br/>");

// set the contents of the string builder as the inner HTML of the DIV element
divAddresses.InnerHtml = htmlStr.ToString(); 
于 2013-10-09T17:38:53.010 回答
2

你的问题是这段代码:

foreach (var item in clib.GetAddressDetails(Convert.ToInt32(Session["mysession"])).FirstOrDefault()) 
{
    // Do stuff
}

FirstOrDefault()部分采用您生成的列表并选择列表中的第一个或返回null

而是这样做:

var item = clib.GetAddressDetails(Convert.ToInt32(Session["mysession"]));

现在您可以使用循环为列表中的每个项目foreach构建一个表格行 ( ),如下所示:<tr>

foreach(var detail in item)
{
    htmlStr.Append("<tr>");
    htmlStr.Append("<td width='25px'>" + detail.FieldName + "</td><tr>");
    htmlStr.Append("</tr>");
}

注意:您应该考虑将返回的变量名称更改为List<myDetails>更直观的名称,例如listOfDetails代替item.

所以整个代码应该是这样的:

public List<myDetails> GetAddressDetails(int id)
{
    List<myDetails> mydetails = new List<myDetails>();
    myDetails details;

    try
    {
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                details = new myDetails(
                              (reader.GetString(reader.GetOrdinal("FieldName")));
                mydetails.Add(details);
        }
        rdr.Close();
        return mydetails;
    }
}

var item = clib.GetAddressDetails(int id);

if (item != null)
{
    StringBuilder htmlStr = new StringBuilder("");
    htmlStr.Append("<center><h2 class='headings'>Addresses</h2>");

    htmlStr.Append("<table border='1' cellpadding='3'>");

    foreach(var detail in item)
    {
        htmlStr.Append("<tr>");
        htmlStr.Append("<td width='25px'>" + detail.FieldName + "</td><tr>");
        htmlStr.Append("</tr>");
    }

    htmlStr.Append("</table></center><br/>");
    divAddresses.InnerHtml = htmlStr.ToString(); 
}
于 2013-10-09T17:39:56.013 回答