首页 > 解决方案 > 为什么在单个页面中使用多个 foreach 循环导致第一个 foreach 与 c# 重复?

问题描述

我正在尝试从数据库中的两个单独的表中提取数据。第一个表包含有关服务的信息,第二个表包含有关公司的信息。我为每个列表创建了课程页面,并且我还更新了我的连接字符串以包含相关信息。这是我到目前为止所尝试的方法和结果。

如果我只注释掉第二个 foreach,那么只有第一个会在网站上呈现 - 而且它呈现完美。

如果我只注释掉第一个 foreach,则只有第二个会在网站上呈现 - 它呈现完美。

如果两者都没有被注释掉,那么第一个将按原样呈现在网站上。然后它重复,采用第二个 foreach 的格式,从而复制 foreach。

我尝试过使用 break(); 并收到一条错误消息。我也尝试使用 return();

我在 VisualStudio 2017 中写这个,c#。

private void Page_Load(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString);
    con.Open();
    str = "select * from Services where Id != 0";
    com = new SqlCommand(str, con);
    SqlDataReader reader = com.ExecuteReader();
    ArrayList servicesList = ConnectionClass.GetServicesbyId(lblTitle.Text);
    StringBuilder sb = new StringBuilder();

    foreach (Services services in servicesList)
    {
        sb.Append(string.Format(@"<div class='col-md-2 col-xs-4'><a href='#'><img class='image-responsive' src='{0}' alt='{1}' /></a><a href='#'><h2>{1}</h2></a><p>{2}</p><a href='#' class='btn btn-lg btn-default btn-block' id='{3}'>{1}</a></div>",
           services.service_box_image, services.title, services.service_short_description, services.services_id));

        lblTitle.Text = sb.ToString();
    }

    reader.Close();
    con.Close();

    str = "select * from Company_Info where Id != 0";
    com = new SqlCommand(str, con);
    ArrayList companyList = ConnectionClass.GetCompanyInfo(lblTagline.Text);

    foreach (Company company in companyList)
    {
        sb.Append(string.Format(@"<div class='col-md-7'><h1>{0}</h1><p class='lead'>{1}</p>
        </div><div class='col-md-1'></ div>",
           company.CompanyTaglineShort, company.CompanyTaglineLong, company.CompanyPhoneMain));

        lblTagline.Text = sb.ToString();

    }

    reader.Close();
    con.Close();
}

标签: c#visual-studioforeach

解决方案


StringBuilder变量调用ToString不会删除 StringBuilder 的内容。数据仍然存在,然后当您继续添加到同一个变量并再次调用 StringBuilder.ToString 方法时,您还将获得在前一个循环中添加的数据。

您只需要清除两个循环之间的变量内容。您应该调用StringBuilder.Clear或只设置StringBuilder.Length = 0;

foreach (Services services in servicesList)
{
   .....
}
....
sb.Clear(); 
....
foreach (Company company in companyList)
{
   ....
}

此外,正如下面 Hans Kesting 所述,您可能应该在循环之外只写一次标签

foreach (Services services in servicesList)
{
   .....
}
lblTitle.Text = sb.ToString()
sb.Clear();
....
foreach (Company company in companyList)
{
   ....
}
lblTagline.Text = sb.ToString();

推荐阅读