2016-09-28 146 views
0

我根據從數據庫中抓取的安全權限動態構建一個導航欄。數據庫查找包含頁面名稱。起初我是用一個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()循環) - 問題是第二個值永遠不會進入下拉菜單。

當我在調試中運行它不經過第二個循環時,它碰到'if(SRmenu.HasRows)'它找不到額外的行,因此它存在循環 - 如果我註釋掉整個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()會迭代到下一條記錄。 'HasRows'方法不適用於測試,如果它仍然有行,所以我在循環之前添加了一個FieldCount,並在其中添加了一個LoopCount。這是行得通的。
+0

您的「for」循環結束* *會從該行獲取每個值(reader.GetValue(i)獲取當前行的第i列的值)。 –

+0

@ David_001 - 對不起,我的意思是說它不會讓我遍歷行。將更新。 – Talion83

+0

@ David_001我曾提到FOR循環是我考慮過的另一個解決方案,但它似乎沒有像我所做的那樣運行。在閱讀我的文章後,我覺得這是輔助信息是不相關的(因爲我目前沒有使用它,並沒有嘗試過/考慮過其他方法)。 – Talion83

回答

0

我做了上面的最終編輯包括,但問題是我試圖使用.NEXTRESULT(),它旨在迭代通過一批查詢。 .READ()將迭代到下一條記錄。

我還發現.HASROWS只檢查讀者是否有,而不是如果有記錄仍然存在。所以我在read()開始和循環計數之前添加了一個fieldcount。

我覺得有一個更好的方法來做到這一點,並可能看到關於在循環之外拉取HTML聲明,然後看看我是否可以從內部正確地添加它們 - 但現在這是工作。