嵌套的foreach()搞砸了

时间:2017-07-10 05:10:39

标签: asp.net foreach webforms

美好的一天,伙计们。

我正在为导航制作一个完整的页面叠加层,而且我过去2天一直试图找出有关嵌套的foreach()循环的问题。

我有这些页面可能与帖子相关联。这就是我想要实现的目标:

Home Page Technologies Page Post 1/ Post 2/ Post3 Contact Us Page About Us Page

但我得到的是:

Home Page Technologies Page Post 1/ Post 2/ Post3 Contact Us Page Post 1/ Post 2/ Post3 About Us Page Post 1/ Post 2/ Post3

以下是我的代码:

  public DataTable GetMain()
    {
        string sql = "SELECT Id,Title,Slug from Pages";

        SqlCommand SQLComm = new SqlCommand(sql, con);
        SqlDataAdapter SQLAd = new SqlDataAdapter(SQLComm);
        DataTable dt = new DataTable();
        SQLAd.Fill(dt);
        return dt;            
    }

   private void GetAll()
    {
        DataTable dt = new DataTable();
        HyperLink newhyperlink = new HyperLink();
        Label newlabel = new Label();

        foreach (DataRow row in GetMain().Rows)
        {
            newlabel.ID = "li";
            MainMenu.Controls.Add(newlabel);
            newlabel.Text = @"<li class""dropdown"" data-toggle=""collapse""";
            newlabel = new Label();

            newhyperlink.ID = "Main";
            MainMenu.Controls.Add(newhyperlink);
            newhyperlink.Text = row["Title"].ToString();
            newhyperlink.NavigateUrl = row["Slug"].ToString();
            newhyperlink = new HyperLink();
            html.Append("></li>");
            html.Append("<ul class=\"list-group\">");

            var sql2 = "SELECT po.Id as PostId, po.Slug as PostSlug, po.Title as PostTitle, pa.Slug as PageSlug, pa.Id as PageId FROM Posts po " +
                       "LEFT JOIN PagesPostsMap m ON po.Id = m.PostId " +
                       "LEFT JOIN Pages pa ON m.PageId = pa.Id  " + 
                       "WHERE pa.Id = "+row["Id"] + "";

            SqlDataAdapter SQLAd = new SqlDataAdapter(sql2, con);
            SQLAd.Fill(dt2);



            foreach (DataRow row2 in dt2.Rows)
            {
                object value = row2["PostId"];
                if (value != DBNull.Value)
                {
                    if (row["Id"] != row2["PageId"])
                    {
                        newlabel.ID = "li";
                        MainMenu.Controls.Add(newlabel);
                        newlabel.Text = @"<li class""dropdown-menu""";
                        newlabel = new Label();

                        newhyperlink.ID = "Sub" + i.ToString();
                        MainMenu.Controls.Add(newhyperlink);
                        newhyperlink.Text = row2["PostTitle"].ToString();
                        newhyperlink.NavigateUrl = row2["PageSlug"].ToString() + "/" + row2["PostSlug"].ToString();
                        newhyperlink = new HyperLink();


                        newlabel.ID = "li";
                        MainMenu.Controls.Add(newlabel);
                        newlabel.Text = "</li>";
                        newlabel = new Label();
                    }
                }

            }

        }

    }

如果课程和内容没有加起来,我很抱歉。我还在试图弄清楚css和JS是如何工作的。

感谢帮助我。

2 个答案:

答案 0 :(得分:0)

public DataTable GetMain()
    {
        string sql = "SELECT Id,Title,Slug from Pages";

        SqlCommand SQLComm = new SqlCommand(sql, con);
        SqlDataAdapter SQLAd = new SqlDataAdapter(SQLComm);
        DataTable dt = new DataTable();
        SQLAd.Fill(dt);
        return dt;            
    }

   private void GetAll()
    {
        DataTable dt = new DataTable();
        HyperLink newhyperlink = new HyperLink();
        Label newlabel = new Label();

        foreach (DataRow row in GetMain().Rows)
        {
            newlabel.ID = "li";
            MainMenu.Controls.Add(newlabel);
            newlabel.Text = @"<li class""dropdown"" data-toggle=""collapse""";
            newlabel = new Label();

            newhyperlink.ID = "Main";
            MainMenu.Controls.Add(newhyperlink);
            newhyperlink.Text = row["Title"].ToString();
            newhyperlink.NavigateUrl = row["Slug"].ToString();
            newhyperlink = new HyperLink();
            html.Append("></li>");
            html.Append("<ul class=\"list-group\">");

            var sql2 = "SELECT po.Id as PostId, po.Slug as PostSlug, po.Title as PostTitle, pa.Slug as PageSlug, pa.Id as PageId FROM Posts po " +
                       "JOIN PagesPostsMap m ON po.Id = m.PostId " +
                       "JOIN Pages pa ON m.PageId = pa.Id  " + 
                       "WHERE pa.Id = "+row["Id"] + "";

            SqlDataAdapter SQLAd = new SqlDataAdapter(sql2, con);
            SQLAd.Fill(dt2);



            foreach (DataRow row2 in dt2.Rows)
            {

                        newlabel.ID = "li";
                        MainMenu.Controls.Add(newlabel);
                        newlabel.Text = @"<li class""dropdown-menu""";
                        newlabel = new Label();

                        newhyperlink.ID = "Sub" + i.ToString();
                        MainMenu.Controls.Add(newhyperlink);
                        newhyperlink.Text = row2["PostTitle"].ToString();
                        newhyperlink.NavigateUrl = row2["PageSlug"].ToString() + "/" + row2["PostSlug"].ToString();
                        newhyperlink = new HyperLink();


                        newlabel.ID = "li";
                        MainMenu.Controls.Add(newlabel);
                        newlabel.Text = "</li>";
                        newlabel = new Label();

            }

        }

    }

答案 1 :(得分:0)

您的代码实际上只是按照您的要求执行操作。对于GetMain中的每一行,您都可以在dt2(datatable2)中订购所有内容。如果你想要你想要的东西,你必须设定一个条件,并将你的第二个foreach置于这种状态。

if(tech parts row)
{
    "your second foreach"
}

如果我错过任何理解,请随时添加更多信息