循环遍历datareader / datatable

时间:2016-09-28 14:34:24

标签: c# asp.net datareader

我正在根据从数据库中获取的安全权限动态构建导航栏。数据库查找包括页面名称。最初我使用的是datareader并执行以下操作:

SqlDataReader SRmenu = sqlCMD.ExecuteReader();
HtmlGenericControl liToAdd;
if (SRmenu.HasRows)
{
    while (SRmenu.Read())
    {
        liToAdd = new HtmlGenericControl("li");
        MainUL1.Controls.Add(liToAdd);
        HtmlGenericControl addpage = new HtmlGenericControl("a");
        addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
        addpage.InnerText = Convert.ToString(SRmenu["Name"]);
        liToAdd.Controls.Add(addpage);
    }
}
SRmenu.Close();
conn.Close();

这完全正常,直到我想添加可能的下拉菜单(对于具有多个页面的人可以访问的部分)。我的更新代码在

下面
if (SRmenu.HasRows)
            {
                while (SRmenu.Read())
                {
                    LoopCount = LoopCount + 1;
                    Int32 AppCount = Convert.ToInt32(SRmenu["AppCount"]);
                    if (AppCount > 1)
                    {
                        Int32 ApplicationID = Convert.ToInt32(SRmenu["ApplicationID"]);
                        Int32 ApplicationID2 = Convert.ToInt32(SRmenu["ApplicationID"]);
                        liToAdd = new HtmlGenericControl("li");
                        liToAdd.Attributes.Add("class", "dropdown");
                        MainUL1.Controls.Add(liToAdd);

                        HtmlGenericControl addhref = new HtmlGenericControl("a");
                        addhref.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
                        addhref.InnerText = Convert.ToString(SRmenu["Name"]);
                        liToAdd.Attributes.Add("class", "dropdown-toggle");
                        addhref.Attributes.Add("data-toggle", "dropdown");
                        liToAdd.Controls.Add(addhref);

                        HtmlGenericControl addspan = new HtmlGenericControl("span");
                        addspan.Attributes.Add("class", "caret");
                        addhref.Controls.Add(addspan);

                        HtmlGenericControl addUL = new HtmlGenericControl("ul");
                        addUL.Attributes.Add("class", "dropdown-menu");
                        liToAdd.Controls.Add(addUL);

                        while (ApplicationID == ApplicationID2)
                        {
                            HtmlGenericControl addDropDown = new HtmlGenericControl("li");
                            addUL.Controls.Add(addDropDown);
                            HtmlGenericControl addpage = new HtmlGenericControl("a");
                            addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
                            addpage.InnerText = Convert.ToString(SRmenu["Name"]);
                            addDropDown.Controls.Add(addpage);
                            SRmenu.Read();
                            if (LoopCount < FieldCount)
                            { ApplicationID2 = Convert.ToInt32(SRmenu["ApplicationID"]); }
                            else
                            { ApplicationID2 = 0; }
                            LoopCount = LoopCount + 1;
                        }
                    }
                    else
                    {
                        liToAdd = new HtmlGenericControl("li");
                        MainUL1.Controls.Add(liToAdd);
                        HtmlGenericControl addpage = new HtmlGenericControl("a");
                        addpage.Attributes.Add("href", Convert.ToString(SRmenu["PageName"]));
                        addpage.InnerText = Convert.ToString(SRmenu["Name"]);
                        liToAdd.Controls.Add(addpage);
                    }
                }
            }

我遇到的问题是在READ()循环中添加一个循环。目前我正在尝试使用While(ApplicationID == ApplicationID2)循环,这让我得到第一个值而不是第二个(当前只有两个页面属于同一个ApplicationID,它们是我的最后两个记录Read()循环) - 问题是第二个值永远不会进入下拉列表。

当我在调试中运行它时,它不会经历第二个循环,它会击中&#39; if(SRmenu.HasRows)&#39;它无法找到额外的行,因此它存在循环 - 如果我注释掉整个IF / ELSE并返回到我的原始代码,它确实会看到所有预期的页面,因此数据存在。

我知道如何在经典ASP中实现这一点,但我很难在C#/ ASP.NET中找到类似的解决方案。我在经典中所做的就像是

RSMenu.open
do while not RSMenu.EoF
    if PageCount>1 then
      <code for drop down segment>
      do while count < PageCount
         <LI HTML Code>
         RSMenu.MoveNext
      loop
    else
        <LI HTML Code>
    end if
    RSMenu.MoveNext
loop

编辑

  1. 更新了关于FOR循环的评论
  2. 删除了对FOR循环的引用。它不是我正在使用的东西,重新阅读后认为它与我的问题无关。它被列为考虑的另一种方法,但它似乎没有解决上述问题。
  3. 看起来像NextResult();是错误的命令,循环通过一批命令,它不会迭代到该读取集中的下一条记录 - 所以我想弄清楚的是如何做到这一点。
  4. 显然Read()迭代到下一条记录。 &#39; HasRows&#39;如果方法仍然有行,那么方法是不是在测试,所以我在循环之前添加了一个FieldCount,并在其中添加了一个LoopCount。这很有效。

1 个答案:

答案 0 :(得分:0)

我做了上面的最终编辑以包含但问题是我试图使用.NEXTRESULT(),它用于迭代一批查询。 .READ()将迭代到下一条记录。

我还发现.HASROWS只检查读者是否有,而不是是否还有记录。所以我在read()开始和循环计数之前添加了一个fieldcount。

我觉得有更好的方法可以做到这一点,并且可能会看到在循环之外拉出HTML声明,然后看看我是否可以从内部正确地添加它们 - 但是现在这是有效的。