2009-04-07 44 views
0

我正在处理Web窗体应用程序,并且我在2-3个地方需要一些HTML代码。
我已经创建的.ascx控制像这样它表示重复的代码:Web窗体中的部分视图

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字符串。
在第二个代码片段中只返回一条记录而不是两条。由于某种原因,如果我将引用传递给另一个控件(c.connRef = s),s会关闭。

也许我错过了一些东西,我不知道。

如果我没有解释清楚,我很抱歉。

回答

2

你的问题是你正在调用Read()方法两次。这就是你的代码基本上在做什么:

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

     } 

每次调用Read()方法都会使数据读取器前进一个记录。你需要去掉其中一个while循环。

您还应该注意,如果您将此数据读取器传递给多个用户控件,则需要将其重置为从每个新用户控件的开始处开始。

+0

您的权利。我专注于功能,我忘了我实际上把Read读入另一个Read。 – lopkiju 2009-04-07 17:05:53