Хоча ні, матеріалу таки є, але все, що мені попадалось, було якимось сируватим. Опрацювавши по частинах найдену інфу, я вирішив написати невеликий хелпер, що буде організовувати бажану фічу.
Поставлена задача: коректно опрацьовувати і формувати в контролі групові рядки, реагувати на пейджінг і саме основне - це групувати не тільки за одним ключовим полем, такби мовити мультигрупуваня.
Коду трохи багато, то ж не буду усього викладати, а опишу лише основне.
Принцип полягає в тому, щоб провіряти ключові поля, і, якщо ці поля співпадають, то залишати в попередньо організовані групі, якщо ні, то створювати нову групу і додавати до нашої таблиці груповий рядок.
Ось метод, котрий робить вищезгадану перевірку:
private bool EvaluateEquals(GridViewGroup g, object dataitem)
{
bool isEqual = false;
if (dataitem == null)
throw new NullReferenceException();
if (g.ActualValues != null)
{
isEqual = true;
for (int i = 0; i < g.Columns.Length; i++)
{
object currentValue = DataBinder.Eval(dataitem, g.Columns[i]);
object groupValue = g.ActualValues[i];
if (currentValue != null && groupValue != null)
{
if (currentValue is DateTime)
{
if (((DateTime)currentValue) == (DateTime)groupValue)
continue;
else { isEqual = false; break; }
}
else
if (currentValue is string)
{
if (currentValue.ToString() == groupValue.ToString())
continue;
else { isEqual = false; break; }
}
else
if (currentValue is Nullable)
{
if ((Nullable)currentValue == (Nullable)groupValue)
continue;
else { isEqual = false; break; }
}
}
else
if (currentValue == null && groupValue == null)//null and null is equal in this case
continue;
else
isEqual = false;
}
}
return isEqual;
}
В коді, що вище, застосовується приведення типів ключових полів та значень рядка з даними. Це для того, щоб забезпечити корректне виконання порівнянь значень, а не посилань. Останнє порівняння
застосовується для організації рівності null значень. Оскільки null != null, то if (currentValue == null && groupValue == null) забезпечить бажаний результат.
Основна функція процесу групування:
private void ProcessGroup(GridViewGroup g, GridViewRowEventArgs e)
{
// Checks if it's still in the same group values
if (e.Row.DataItem != null)
{
if (!EvaluateEquals(g, e.Row.DataItem))
{
// Another group values starts now
g.Reset();
g.SetActualValues(GetGroupRowValues(g, e.Row.DataItem));
string text = string.Empty;
GridViewRow newRow = InsertGridRow(e.Row);
int i = 0;
foreach (object v in g.ActualValues)
{
TableCell tc = new TableCell();
tc.Text = (v ?? string.Empty).ToString();
newRow.Cells.AddAt(i, tc);
text += (v ?? string.Empty).ToString() + " ";
i++;
}
// Triggers event GroupHeader
if (GroupHeaderEvent != null)
{
GroupHeaderEvent(g.Name, g.ActualValues, newRow);
}
}
}
}
g.Reset() - метод скидає попередню групу, а метод g.SetActualValues(GetGroupRowValues(g, e.Row.DataItem)) -записує фактичні значення ключових полів для новоствореної групи.
InsertGridRow(e.Row) - ще одна допоміжна функція, що додає новий рядок для відображення групових значень.
Тепер залишається останнє - використання вищевикладеного:
В класі веб-сторінки в обробнику події Init реєструєм групу таким чином:
GridViewHelper gvHelper = new GridViewHelper(gvMyGridView);
string[] items = new string[] { "ID", "Date", "Customer", "Location" }; // - визначаємо список ключових полів для групування, повинні співпадати з полями з датасорс
gvHelper.GroupHeader += new GroupEvent(gvHelper_GroupHeader); // - не обовязково, реакція на створення групи, можна використовувати наприклад для встановлення кольору рядка в таблиці ГрідВю
gvHelper.RegisterGroup(items, true, false);// - реєструєм Групу
Для коректного пейджинга потрібно не мало не багато:
public void Paginate()
{
foreach (GridViewGroup g in mGroups)
{
g.Reset();
}
}
Цей відкритий метод використовуєм в обробці пейджінга на сторінці.
От і все. Такий короткий опис основних функцій хелпера.
Хочу наголосити, що даний хелпер опрацьовує групування для кожної сторінки таблиці при пейджінгу, тобто при переході на наступну-поперелню сторінку групи обчислюються заново. Це приємливо у більшості випадків, хоча може бути необхідним і інший, а саме: необхідність організувати групування по всіх пейджах таблиці. На це потрібно набагато більше зусиль, часу і коду)), тож зараз над цим працюю. Також планую перенести весь код хелпера в кастом контрол. Якщо когось зацікавить - любязно поділюся контролкою)))...але це все "опосля".
Наостанок викладаю архів з хелпером.
Прывітанне, я Хелена Хуліё з Эквадора, хачу пагаварыць пра спадара Бенджаміна на гэтую тэму. аказвае мне фінансавую падтрымку, калі ўвесь банк у маім горадзе адмовіўся ад маёй просьбы прадаставіць мне крэдыт у 500 000,00 долараў, я паспрабаваў усё магчымае, каб атрымаць пазыку ў маіх банкаў тут, у Эквадоры, але ўсе яны адхілілі мяне, таму што мой крэдыт быў невялікім, але з Божай ласкай я даведаўся пра містэра Бенджаміна, таму вырашыў паспрабаваць падаць заяўку на крэдыт. Бог жадае, каб яны выдалі мне крэдыт у памеры 500 000,00 долараў на просьбу аб пазыцы, якую мае банкі тут, у Эквадоры, адхілілі мяне, гэта сапраўды было дзіўным з імі, і мой бізнес ідзе добра. Па электроннай пошце / WhatsApp звяжыцеся, калі вы хочаце атрымаць крэдыт ад іх. Lfdsloans@outlook.comWhatsApp Кантакт: + 1-989-394-3740.
ВідповістиВидалити