데이터베이스에서 확보 한 보안 권한을 기반으로 탐색 바를 동적으로 구축하고 있습니다. 데이터베이스 조회에는 페이지 이름이 포함됩니다. 처음에 나는 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
편집
- FOR 루프에 루프에 대한
- 제거 기준에 대한 최신 의견 같은 것입니다. 그것은 내가 사용하고 있던 것이 아니고, 다시 읽은 후에 제 질문에 관련이 없다고 생각합니다. 그것은 고려 된 또 다른 방법으로 열거되었지만 위의 문제를 해결하는 것으로 보이지 않았습니다.
- NextResult()와 유사합니다. 잘못된 명령인데, 그 명령 세트를 통해 반복되는 명령 집합을 반복합니다. 그래서 내가 알아 내려고하는 것은 그것을하는 방법입니다.
- 분명히 Read()는 다음 레코드를 반복합니다. 'HasRows'메소드가 여전히 행을 가지고 있다면 테스트를 위해 작동하지 않아 루프 이전의 FieldCount와 루프 카운트를 추가했습니다. 그게 효과가있다.
끝에있는 "for"루프는 * 행에서 모든 값을 가져옵니다 (reader.GetValue (i)는 현재 행의 i 번째 열 값을 가져옵니다). –
@ David_001 - 죄송합니다. 행을 반복 할 수 없다는 의미였습니다. 업데이트됩니다. – Talion83
@ David_001 내가 생각했던 또 다른 솔루션으로 FOR 루프를 언급했지만, 내가했던 것과 다르게 작동하는 것으로 보지 못했습니다.내 게시물을 읽은 후에 관련이없는 부수적 인 정보라고 느꼈습니다. (현재 내가 사용하고 있지 않았으므로 다른 방법을 시도하거나 고려하지 않았기 때문에). – Talion83