Я динамически создаю навигатор, основанный на разрешениях безопасности, захваченных из базы данных. Поиск в базе данных включает имя страницы. Изначально я использовал DataReader и делать ниже:Итерация через datareader/datatable внутри цикла
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), и это позволяет мне получить 1-е значение, но не второе (в настоящее время только два страницы попадают в один и тот же 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
Edits
- обновленный комментарий о цикл
- Удалены ссылкой на цикл. это не то, что я использовал, и после повторного чтения чувствую, что это не относится к моему вопросу. Он был указан как другой метод, но он, похоже, не предлагал решения вышеупомянутой проблемы.
- Похоже NextResult(); это неправильная команда, которая проходит через партию команд, которые она не перебирает в следующую запись в этом наборе чтения, поэтому я пытаюсь выяснить, КАК это сделать.
- Очевидно, что Read() повторяет следующую запись. Метод «HasRows» не работал для тестирования, если у него STILL были строки, поэтому я добавил в FieldCount до цикла и LoopCount внутри. Это работает.
Ваш цикл «for» в конце * * получает каждое значение из строки (reader.GetValue (i) получает значение i-го столбца текущей строки). –
@ David_001 - Извините, я хотел сказать, что это не позволяет мне перебирать строки. Будет обновляться. – Talion83
@ David_001 Я упомянул цикл FOR как другое решение, которое я рассмотрел, но не показалось, что оно будет работать иначе, чем то, что я делал.Прочитав мой пост, я почувствовал, что это вспомогательная информация, которая не имеет отношения к делу (поскольку я не использовал ее в данный момент, и я не изучал другие методы, которые мы рассматривали). – Talion83