Вставлять новую строку каждые 4 элемента в строке?

#c# #sql #count #newline #stringbuilder

#c# #sql #количество #новая строка #stringbuilder

Вопрос:

У меня есть строка, которая устанавливает эскизы один за другим без разрывов строк. Изображения переносятся на следующую строку, как только они достигают максимальной ширины области, в которой они находятся. Я хочу вставить разрыв строки после каждого 4-го эскиза, и код, который у меня есть, почти работает, но он продолжает добавлять новую строку после 1-го изображения — это выглядит неправильно. С 7 уменьшенными изображениями должен быть добавлен только один разрыв строки, и это будет после 4-го изображения.

Вот информация о классе, которая используется для вызова и построения строки с информацией о миниатюрах из базы данных SQL:

 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 amp;amp; 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;
    }
 

Это часть кода, которая использует класс GetGlassItems . Здесь новая строка должна вставляться после каждого 4-го элемента, но также добавляется новая строка после первого элемента:

 protected String BuildCutGlass(Guid CurrentPage)
 {
        var items = GetGlassItems(new Guid(CurrentPage.ToString()));
        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].ThumbnailPath,
                                        items[i].GlassName));
            Console.Write("count: "   items.Count.ToString()   "<br />");
            if (i == 4)
            {
                // new line every 4 items
                Glass.Append("<div style='clear: both;'></div>");
            }
        }

        return Glass.ToString();
    }
 

Как я могу отредактировать приведенный выше код, чтобы новая строка больше не добавлялась после первого эскиза?

Ответ №1:

Вам нужна проверка с помощью оператора модуля.

 if (i % 4 == 0)
 

Это позволит вам вставлять новую строку каждую четвертую строку.

Но это также вставит новую строку для первого элемента, поскольку i будет 0 и 0 % 4 вернется 0 . Поэтому измените свой чек как:

 if(i != 0 amp;amp; i % 4 == 0)
 

Ваша текущая проверка i == 4 добавит дополнительную строку только после первых четырех строк.

Комментарии:

1. Я попробовал проверку модуля, но я получаю ту же самую проблему: новая строка добавляется после 1-го эскиза, затем после каждого 4-го. Я не знаю, почему он должен продолжать вставлять новую строку после 1-го элемента, но это не то, чего я хочу.

2. @SaraDeJaneiro 0 % 0 == 0. Настройте исключение для этого в своем операторе if.

3. @Habib Разве это не должно быть (i-1) % 4 == 0?? В вашем примере выводится единица после нулевой и четвертой строк. Мы хотим после третьего индекса.

4. @Habib Для меня это сработало идеально. Большое спасибо!

5. @Habib да, извините, я 1, а не я — 1. Не уверен, о чем я думал.