2016-09-28 6 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) 루프를 사용하려고하는데, 이것은 첫 번째 값을 얻지 만 두 번째 값을 갖지 못하게합니다. (현재 두 개의 페이지가 같은 ApplicationID에 속하며 내 두 개의 레코드가 있습니다. Read() 루프) - 문제는 두 번째 값이 절대로 드롭 다운되지 않는다는 것입니다.

디버그에서 두 번째 루프를 통과하지 못하면 'if (SRmenu.HasRows)'루프에 추가 행을 찾지 못합니다. 전체 IF/다시 원래의 코드로 돌아 가면 예상되는 모든 페이지가 표시되어 데이터가 표시됩니다.

나는 이것을 고전적인 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. 제거 기준에 대한 최신 의견 같은 것입니다. 그것은 내가 사용하고 있던 것이 아니고, 다시 읽은 후에 제 질문에 관련이 없다고 생각합니다. 그것은 고려 된 또 다른 방법으로 열거되었지만 위의 문제를 해결하는 것으로 보이지 않았습니다.
  3. NextResult()와 유사합니다. 잘못된 명령인데, 그 명령 세트를 통해 반복되는 명령 집합을 반복합니다. 그래서 내가 알아 내려고하는 것은 그것을하는 방법입니다.
  4. 분명히 Read()는 다음 레코드를 반복합니다. 'HasRows'메소드가 여전히 행을 가지고 있다면 테스트를 위해 작동하지 않아 루프 이전의 FieldCount와 루프 카운트를 추가했습니다. 그게 효과가있다.
+0

끝에있는 "for"루프는 * 행에서 모든 값을 가져옵니다 (reader.GetValue (i)는 현재 행의 i 번째 열 값을 가져옵니다). –

+0

@ David_001 - 죄송합니다. 행을 반복 할 수 없다는 의미였습니다. 업데이트됩니다. – Talion83

+0

@ David_001 내가 생각했던 또 다른 솔루션으로 FOR 루프를 언급했지만, 내가했던 것과 다르게 작동하는 것으로 보지 못했습니다.내 게시물을 읽은 후에 관련이없는 부수적 인 정보라고 느꼈습니다. (현재 내가 사용하고 있지 않았으므로 다른 방법을 시도하거나 고려하지 않았기 때문에). – Talion83

답변

0

위의 마지막 편집을 포함했지만 문제는 배치 쿼리를 반복하기 위해 의도 된 .NEXTRESULT()를 사용하려고했기 때문입니다. .READ()는 다음 레코드로 반복됩니다.

.HASROWS는 판독기가 있는지 만 확인합니다. 아직 레코드가 남아 있지 않은지 확인합니다. 그래서 read() 시작 및 루프 카운트 이전에 fieldcount에 추가했습니다.

이렇게하는 것이 더 좋은 방법 인 것 같아요. 그리고 루프 외부에서 HTML 선언을 당겨서 내부에서 제대로 추가 할 수 있는지를 볼 수 있습니다.하지만 지금 당장이 코드가 작동합니다.

관련 문제