2

クラス ライブラリ内に、リストを使用し 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;
    }
}

を使用しStringBuilderて 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または単純なforまたは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>、より直感的な名前に変更することを検討する必要があります。listOfDetailsitem

したがって、コード全体は次のようになります。

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 に答える