2013-10-09 4 views
2

У меня есть класс внутри моей библиотеки классов, который имеет метод, который использует список с SqlDataReader, чтобы перебирать все записи.StringBuilder таблица html из моей библиотеки классов классов

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, но возникают проблемы, выяснить, как Переберите мой список коллекции правильно. Я попробовал пару разных циклов, но они не дали правильных результатов.

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(); 
    } 


     } 

ответ

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.

Так весь код должен выглядеть следующим образом: (. Уаг элемент в clib.GetAddressDetails (Convert.ToInt32 (Session [ "mysession"])) FirstOrDefault())

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(); 
} 
+0

Когда я пытаюсь это сделать, он говорит, что он не содержит общедоступного определения для GetEnumerator – Tim

+0

Является ли это ошибкой компилятора или ошибкой во время выполнения? –

+0

Извините, я хочу сказать ошибку компилятора, но не полностью уверен – Tim

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(); 
+0

Еогеасп { – Tim

+0

Когда я попробуйте это, он говорит, что он не содержит общедоступного определения для GetEnumerator – Tim

+0

@Tim - Извините, но почему вы добавляете '.FirstOrDefault()' к вызову метода? Это дает вам один элемент (первый) в перечислении. –

Смежные вопросы