我根據從數據庫中抓取的安全權限動態構建一個導航欄。數據庫查找包含頁面名稱。起初我是用一個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
編輯
- 有關FOR循環
- 刪除參考FOR循環更新的評論。這不是我正在使用的,重新閱讀後覺得它與我的問題無關。它被列爲另一種考慮的方法,但似乎沒有解決上述問題。
- 看起來像NextResult();是錯誤的命令,它通過一批命令循環,它不會迭代到該讀集中的下一個記錄 - 所以我想弄清楚的是如何做到這一點。
- 顯然,Read()會迭代到下一條記錄。 'HasRows'方法不適用於測試,如果它仍然有行,所以我在循環之前添加了一個FieldCount,並在其中添加了一個LoopCount。這是行得通的。
您的「for」循環結束* *會從該行獲取每個值(reader.GetValue(i)獲取當前行的第i列的值)。 –
@ David_001 - 對不起,我的意思是說它不會讓我遍歷行。將更新。 – Talion83
@ David_001我曾提到FOR循環是我考慮過的另一個解決方案,但它似乎沒有像我所做的那樣運行。在閱讀我的文章後,我覺得這是輔助信息是不相關的(因爲我目前沒有使用它,並沒有嘗試過/考慮過其他方法)。 – Talion83