データベースから取得したセキュリティ権限に基づいて動的にナビゲーションバーを構築しています。データベースルックアップにはページ名が含まれます。当初、私は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
編集
- FORループにループFOR
- 削除参照について、更新されたコメントのようなものです。それは私が使用していたものではなく、再読した後に私の質問には関係がないと感じました。それは考慮された別の方法として記載されていましたが、上記の問題を解決するようには見えませんでした。
- 次のようになります。間違ったコマンドです。その読み込みセットの次のレコードに反復しないコマンドのバッチをループします。そのため、私が理解しようとしているのは、それを行う方法です。
- 明らかに、Read()は次のレコードに反復します。 'HasRows'メソッドは、まだ行がある場合はテストするためには機能しませんでしたので、ループの前にFieldCountを追加し、ループ内にLoopCountを追加しました。それは働いている。
最後の "for"ループは*行からすべての値を取得します(reader.GetValue(i)は現在の行のi番目の列の値を取得します)。 –
@ David_001 - 申し訳ありませんが、それは私が行を繰り返すことはできませんと言っていた。更新されます。 – Talion83
@ David_001私が考えていた別の解決策としてFORループを言及しましたが、それは私がやっていたこととは異なって機能するとは思われませんでした。私の記事を読んだ後、私はそれが関連していない補助的な情報であると感じました(私は現在それを使用していなかったので、私は他の方法を試したり考えなかったので)。 – Talion83