2016-09-28 2 views
0

Я динамически создаю навигатор, основанный на разрешениях безопасности, захваченных из базы данных. Поиск в базе данных включает имя страницы. Изначально я использовал 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

  1. обновленный комментарий о цикл
  2. Удалены ссылкой на цикл. это не то, что я использовал, и после повторного чтения чувствую, что это не относится к моему вопросу. Он был указан как другой метод, но он, похоже, не предлагал решения вышеупомянутой проблемы.
  3. Похоже NextResult(); это неправильная команда, которая проходит через партию команд, которые она не перебирает в следующую запись в этом наборе чтения, поэтому я пытаюсь выяснить, КАК это сделать.
  4. Очевидно, что Read() повторяет следующую запись. Метод «HasRows» не работал для тестирования, если у него STILL были строки, поэтому я добавил в FieldCount до цикла и LoopCount внутри. Это работает.
+0

Ваш цикл «for» в конце * * получает каждое значение из строки (reader.GetValue (i) получает значение i-го столбца текущей строки). –

+0

@ David_001 - Извините, я хотел сказать, что это не позволяет мне перебирать строки. Будет обновляться. – Talion83

+0

@ David_001 Я упомянул цикл FOR как другое решение, которое я рассмотрел, но не показалось, что оно будет работать иначе, чем то, что я делал.Прочитав мой пост, я почувствовал, что это вспомогательная информация, которая не имеет отношения к делу (поскольку я не использовал ее в данный момент, и я не изучал другие методы, которые мы рассматривали). – Talion83

ответ

0

Я включил в себя окончательные изменения, но проблема заключается в том, что я пытался использовать .NEXTRESULT(), который предназначен для итерации через партию запросов. .READ() перейдет к следующей записи.

Я также нашел .HASROWS проверяет только, есть ли у читателя, если нет записей. Поэтому я добавил в поле значение перед началом чтения() и количеством циклов.

Я чувствую, что есть лучший способ сделать это и увидеть, как тянуть объявления HTML за пределами цикла, а затем видеть, могу ли я правильно добавить их изнутри - но сейчас это работает.

Смежные вопросы