пʼятниця, 14 травня 2010 р.

Групування в ASP.NET GridView server control

Усім відомо, що в контролі GridView немає фічі групування за ключовими полями. В неті також не так багато матеріалу по тому, як організувати "ручками" таку властивість, а про безплатні контроли уже мовчу.
Хоча ні, матеріалу таки є, але все, що мені попадалось, було якимось сируватим. Опрацювавши по частинах найдену інфу, я вирішив написати невеликий хелпер, що буде організовувати бажану фічу.
Поставлена задача: коректно опрацьовувати і формувати в контролі групові рядки, реагувати на пейджінг і саме основне - це групувати не тільки за одним ключовим полем, такби мовити мультигрупуваня.
Коду трохи багато, то ж не буду усього викладати, а опишу лише основне.
Принцип полягає в тому, щоб провіряти ключові поля, і, якщо ці поля співпадають, то залишати в попередньо організовані групі, якщо ні, то створювати нову групу і додавати до нашої таблиці груповий рядок.
Ось метод, котрий робить вищезгадану перевірку:
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();
}
}

Цей відкритий метод використовуєм в обробці пейджінга на сторінці.
От і все. Такий короткий опис основних функцій хелпера.
Хочу наголосити, що даний хелпер опрацьовує групування для кожної сторінки таблиці при пейджінгу, тобто при переході на наступну-поперелню сторінку групи обчислюються заново. Це приємливо у більшості випадків, хоча може бути необхідним і інший, а саме: необхідність організувати групування по всіх пейджах таблиці. На це потрібно набагато більше зусиль, часу і коду)), тож зараз над цим працюю. Також планую перенести весь код хелпера в кастом контрол. Якщо когось зацікавить - любязно поділюся контролкою)))...але це все "опосля".
Наостанок викладаю архів з хелпером.

четвер, 29 квітня 2010 р.

Гучність слів vs. Реальність

Останнім часом, більше пів року, слідкую за перебігом подій в Львів Старт Клаб та діяльністю його організатора Ростислава Чайки. От що мені спало на думку та наводить на роздуми.
Так, Lviv StartUp club - це справді хороший захід, який дає можливість вивчити умови і стан, як українського, так і забугорського ІТ бізнесу. З-відти можна почерпнути багато чого цікавого та корисного. Навіть деякі, здавалось банальні речі, про які говорять в клабі є насправді не такі вже і банальні та очевидні. Дякую всім організаторам, особливо Р.Чайці, і учасникам цього клубу за їхні внески у розвиток ІТ Бізнесу у Львові.
Тепер трохи скептицизму. Виходячи з усього побаченого і почутого від Р Чайки - задаюся питанням, а чи не занадто гучні слова він використовує у своїх блогах, твіттері, інтервю телебаченню та інших інформаційних каналах, а не зарано ще вживати такі слова як інкубатор, бізнес-ангел, інформаційний самміт і охрещувати ними все, що володіє хоча б однією властивістю справжніх значень цих слів. А чи не просто це піар самого себе і того що "я" роблю. І чи насправді все те про що Чайка говорить та пише є насправді таким? Далеко не треба іти, візьмемо самого засновника - він називає себе Бізнес-Ангелом. "У цілому світі бізнес-ангели – це люди, які заробили гроші або працюючи як топ-менеджери на великих підприємствах, або заробили гроші у власному бізнесі. І вкладають ці гроші у нові цікаві проекти, які їм пропонують або їхні знайомі, або мережі бізнес-ангелів", - розповів засновник Lviv Startup Club Ростислав Чайка.(http://www.city-adm.lviv.ua/news/economy/8138-biznes-angeli-jidut-do-lvova) Куди Ростиславе ви вклали гроші? Все слова та слова, а на ділі "пшик", як то кажуть, головне щоб обгортка була, а що в середині вже не важно.... Так, обслідуючи весь львівський нет, таке враження, що крім Ростика, ніхто популяризацією та допомогою Львівському ІТ Бізнесу не займається, він і публікується в неті, і інтервю дає місцевому телебаченню. А чи не дає це право самому встановлювати рамки кому ким бути, чи називатися БА, чи з звичайного зборища зробити інкубатор....спокуса є, погодьтесь.
24 квітня у Львові в готелі "Леополіс" мав відбутися Lviv Business Angel Summit. Гугл аж кишів інфою про цей захід. А от звіту, короткого резюме я так і не побачив з цього саміту. Чому? Провал? Прогоріли? Залишається тільки здогадуватись......
П.С.: Критика поганою не буває, якщо про вас пишуть, значить щось хороше ви все-таки робите:). Бажаю Ростиславу успіхів у всіх його починаннях...

четвер, 15 квітня 2010 р.

HOWTO: Select the row in GridView ASP.NET control

Як селектнути стрічку в ГрідВю?
Можна зробити щось таке:

В код-біхайнд обробити івент гріда RowDataBound :

grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
     e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(this.grid, "Select$" + e.Row.RowIndex);
}
}

або

grid_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{

  if (grid.EditIndex == -1) {
 
e.Row.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference((System.Web.UI.Control)sender, "Select$" + e.Row.RowIndex.ToString));
}
}

або

protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex == -1)
return;

e.Row.Attributes.Add("onclick",
  this.GetPostBackClientEvent(grid, "Select$" + e.Row.RowIndex.ToString()));
}

середа, 31 березня 2010 р.

неділя, 21 березня 2010 р.

CodePlex...Is it great?

Підключився до одного опен-сорс проекту по ASP.NET MVC Framework на Кодплексі. Цікаво що з того вийде і наскільки корисно буде участь в ньому... поексперементую.... За тиждень побачим....

субота, 13 березня 2010 р.

Кожного тижня намагатимусь записувати свої думки, ситуації, та цікаві на мій погляд речі, з якими стикався в робочому процесі.