Web表单中的部分视图

时间:2009-04-07 16:30:33

标签: c# asp.net webforms

我正在开发一个Web窗体应用程序,我还需要2-3个以上的HTML代码 我已经像这样创建了.ascx控件,它代表了重复的代码:

    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只返回一个记录而不是两个记录。出于某种原因,如果我将引用传递给另一个控件(c.connRef = s),s将关闭。

也许我错过了什么,我不知道。

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

1 个答案:

答案 0 :(得分:2)

您的问题是您正在调用Read()方法两次。这是您的代码基本上正在做的事情:

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

        }

对Read()方法的每次调用都会使数据读取器前进一条记录。你需要取出一个while循环。

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