2016-09-28 15 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(); 

これは完璧にうまく働きました。私の更新されたコードは

私はREAD()ループ内でループに追加されている問題に実行しています
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); 
        } 
       } 
      } 

を下回っています。現在のところ、While(ApplicationID == ApplicationID2)ループを使用しようとしています。これにより、第1の値を取得できますが、第2の値は取得されません(現在、2つのページのみが同じApplicationID内にあります。 Read()ループ) - 問題は、2番目の値が決してドロップダウンしないということです。

私がデバッグで実行すると、2番目のループを通過せず、ループが存在するように追加の行を見つけられない場合は '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ループにループFOR
  2. 削除参照について、更新されたコメントのようなものです。それは私が使用していたものではなく、再読した後に私の質問には関係がないと感じました。それは考慮された別の方法として記載されていましたが、上記の問題を解決するようには見えませんでした。
  3. 次のようになります。間違ったコマンドです。その読み込みセットの次のレコードに反復しないコマンドのバッチをループします。そのため、私が理解しようとしているのは、それを行う方法です。
  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宣言を引っ張って、内側から適切に追加できるかどうかを確認することができます。

関連する問題