2009-04-07 3 views
0

Я работаю над приложением Web Forms, и у меня есть код HTML, который мне нужен еще в 2-3 местах.
Я создал ASCX-контроль, как так, который представляет собой повторяющийся код:PartialView в веб-формах

protected override void Render(HtmlTextWriter writer) 
    { 
     StringBuilder str = new StringBuilder(); 

     while (connRef.Read()) 
     { 
      str.Append(connRef["some_database_field"]); 
     } 

     writer.Write(str.ToString()); 

     base.Render(writer); 
    } 

connRef является ссылкой на объект DataReader, что я прохожу, где мне нужен этот кусок кода, чтобы сделать.
В другом элементе управления, я использую следующий код:

 MSSqlConn s = new MSSqlConn(); 
     StringBuilder str = new StringBuilder(); 

     s.OpenConn("select * from notes order by note_date desc;"); 

     notes.note c = (notes.note)Page.LoadControl(@"/controls/notes/note.ascx"); 
     c.ID = "note"; 
     c.connRef = s; 

     while (s.Read()) 
     { 
      str.Append(Html.RenderControl(c)); 
     } 
     s.CloseConn(); 

     Response.Write(str.ToString()); 

MSSqlConn это мой класс для подключения к базе данных.
RenderControl предоставляет любой элемент управления в виде строки HTML.
s во втором фрагменте кода возвращает только одну запись вместо двух. По какой-то причине s закрывается, если передать ссылку на другой элемент управления (c.connRef = s).

Возможно, я что-то упустил, я не знаю.

Прошу прощения, если я не объяснил это хорошо.

ответ

2

Ваша проблема заключается в том, что вы дважды вызываете метод Read(). Это то, что делает ваш код в основном:

 while (s.Read()) 
     { 
      while (connRef.Read()) 
      { 
       str.Append(connRef["some_database_field"]); 
      } 

     } 

Каждый вызов метода Read() продвигает считыватель данных по одной записи. Вам нужно вынуть одну из петель.

Вы также должны заметить, что если вы передаете этот считыватель данных нескольким пользовательским элементам управления, вам нужно будет сбросить его, чтобы начать с начала для каждого нового пользовательского элемента управления.

+0

Ваше право. Я сосредоточился на функциональности, которую забыл, что на самом деле я прочитал Read внутри другого Read. – lopkiju

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