【问题标题】:Adding a line break inside a string under certain circumstances在某些情况下在字符串中添加换行符
【发布时间】:2014-06-18 12:44:21
【问题描述】:

我正在开发一个旧的 Sitefinity 网站,在某些产品页面上,有一系列可用的切割玻璃选项。这些被列为可以单击并打开到弹出窗口中的缩略图图像。现在,代码已设置为创建包含缩略图部分和缩略图本身的 div,并且它们以连续字符串的形式一个接一个地显示。当缩略图达到它们所在区域的宽度时,它们会下降到下一行。现在的问题是需要将三个剪切类缩略图组合在一起,即使这意味着将它们移动到下一行。

我不知道该怎么做,因为我不想做不必要的工作。此外,这不是我创建的代码 - 这是我必须编辑的其他人的代码(此人无法回答问题)。

这是设置包含缩略图的 div 的代码(GlassItem 是包含每个切割玻璃缩略图的 div 的名称):

protected String BuildCutGlass(Guid CurrentPage)
    {
        StringBuilder Glass = new StringBuilder();

        using (MySqlConnection cn = new MySqlConnection(ConfigurationManager.ConnectionStrings["Sitefinity"].ToString()))
        {
            cn.Open();

            MySqlCommand cmd = new MySqlCommand("SELECT id, BrandID, GlassName, Thumbnail, LargeImage, Ordinal, (SELECT Window_Brands.BrandName FROM Window_Brands WHERE Window_Brands.BrandPage = BrandID) AS BrandName FROM Window_Brand_cutglass WHERE BrandID = ?PageID AND Thumbnail IS NOT NULL AND LargeImage IS NOT NULL ORDER BY Ordinal", cn);
            cmd.Parameters.Add(new MySqlParameter("PageID", CurrentPage.ToString()));

            using (MySqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    if (reader["Thumbnail"].ToString().Length > 1 && reader["LargeImage"].ToString().Length > 1)
                        Glass.Append(String.Format("<div class='GlassItem'><a href='{0}' class='CutGlassPopup Icon'><img src='{1}' alt='{2}' width='77' height='77' /></a><a href='{0}' class='CutGlassPopup'>{2}</a></div>", Revere.GetImagePath(reader["LargeImage"].ToString()), Revere.GetImagePath(reader["Thumbnail"].ToString()), reader["GlassName"].ToString()));
                }
            }

            cn.Close();
        }

        return Glass.ToString();
    } 

【问题讨论】:

  • 你有办法指出哪些需要放在一起吗?我建议保留一个计数变量并在while循环中递增它,并在您达到特定数字时将&lt;/br&gt;或其他内容附加到字符串构建器中......然后重置计数......但实际上你需要一个额外的组标志数据库以正确执行此操作。
  • 如果布局正确处理此类 div,则可能只是将它们全部放入一个空的无样式 div。如果您无法确定应该对其中的哪些进行分组,那么您应该使用一些额外的标志或类型字段重新设计数据存储。
  • 我想我要做的是编辑数据库并添加一个新字段来表示缩略图 id。然后我可以根据它做一个 sql 选择。

标签: c# html line-breaks sitefinity


【解决方案1】:

这可能不是您正在寻找的快速解决方案,但此代码难以使用的原因是您的数据检索代码与您的 html 生成代码混合在一起。我会为GlassItem 创建一个类并修改方法以返回它们的列表。

public class GlassItem
{
    public string LargeImagePath {get;set;}
    public string ThumbnailPath {get;set;}
    public string GlassName {get;set;}
}

protected List<GlassItem> GetGlassItems(Guid CurrentPage)
{
    var items = new List<GlassItem>();

   using (MySqlConnection cn = new MySqlConnection(ConfigurationManager.ConnectionStrings["Sitefinity"].ToString()))
   {
       cn.Open();

       MySqlCommand cmd = new MySqlCommand("SELECT id, BrandID, GlassName, Thumbnail, LargeImage, Ordinal, (SELECT Window_Brands.BrandName FROM Window_Brands WHERE Window_Brands.BrandPage = BrandID) AS BrandName FROM Window_Brand_cutglass WHERE BrandID = ?PageID AND Thumbnail IS NOT NULL AND LargeImage IS NOT NULL ORDER BY Ordinal", cn);
       cmd.Parameters.Add(new MySqlParameter("PageID", CurrentPage.ToString()));

       using (MySqlDataReader reader = cmd.ExecuteReader())
       {
           while (reader.Read())
           {
               if (reader["Thumbnail"].ToString().Length > 1 && reader["LargeImage"].ToString().Length > 1)
                {
                    items.Add(new GlassItem 
                            { 
                                LargeImagePath = Revere.GetImagePath(reader["LargeImage"].ToString()), 
                                ThumbnailPath = Revere.GetImagePath(reader["Thumbnail"].ToString()), 
                                GlassName = reader["GlassName"].ToString()
                            });
                }   
           }
       }

       cn.Close();
   }

    return items;
}

然后您可以使用 linq 等来确定每行需要哪些项目,或者您也可以使用简单的循环。

    var items = GetGlassItems(new Guid("..."));
    StringBuilder Glass = new StringBuilder();

    for(int i = 0; i < items.Count();i++)
    {
        Glass.Append(String.Format("<div class='GlassItem'><a href='{0}' class='CutGlassPopup Icon'><img src='{1}' alt='{2}' width='77' height='77' /></a><a href='{0}' class='CutGlassPopup'>{2}</a></div>", 
                                    items[i].LargeImagePath, 
                                    items[i].Thumbnail, 
                                    items[i].GlassName));
        if(i % 5 == 0 )
        {   
            // new line every 5 items
            Glass.AppendLine();
        }
    }

【讨论】:

  • 我明天要试一试,看看它是否有效。这似乎是个好主意。我只是希望旧的 Sitefinity 代码可以处理它。
  • 好的,我试了一下你的代码,它大部分都有效。但是,每 5 个项目附加一个新行的 if 语句不能按预期工作。我不得不做出改变,仅仅使用 Glass.AppendLine() 并没有做任何事情。现在我有 Glass.Append("
    ")。这可行,但是它会在第一个缩略图之后添加一个新行。我有 7 个缩略图,代码应该每 5 个缩略图放置一个新行。在集合中的第一个缩略图之后错误地添加新行的代码可能有什么问题?
  • 好的,我解决了这个问题。代码现在很好用。非常感谢!
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2023-01-10
  • 2010-12-21
  • 2014-05-24
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多