#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. Не уверен, о чем я думал.