2009-04-07 8 views
0

私はWebフォームアプリケーションで作業していますが、私は2-3の場所で必要ないくつかのHTMLコードを持っています。Webフォームの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オブジェクトへの参照である:そう繰り返しコードを表すよう
私する.ascxコントロールを作成しました。他の制御で
は、私は次のコードを使用し

 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文字列としてレンダリングします。
秒のコードスニペットでは、2つではなく1つのレコードのみが返されます。何らかの理由で、別のコントロール(c.connRef = s)に参照を渡すと、sが閉じます。

多分私は何かを逃している、私は知らない。

私はそれをうまく説明していないと申し訳ありません。

答えて

2

問題は、Read()メソッドを2回呼び出すことです。

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

     } 

Read()メソッドを呼び出すたびに、データリーダーが1レコードだけ前進します。 whileループのうちの1つを取り出す必要があります。

このデータリーダーを複数のユーザーコントロールに渡している場合は、新しいユーザーコントロールごとに最初から開始するようにリセットする必要があることにも注意してください。

+0

あなたの権利。私は、実際に別のReadの中にReadを置いていたことを忘れていた機能に集中しました。 – lopkiju