2013-02-27 1 views
0

Мне нужно добавить строку в gridview, которая имеет AutoGenerateColumns = "true". Вот трюк. SQL-запрос написана таким образом (с помощью шарнира), что она возвращает записи в группах по три, как показано ниже:Автоматическое добавление строки в gridview при наличии определенных условий

Repair Code Repair Code Entries 6/1/2012 7/1/2012 8/1/2012 9/1/2012 
00000A Critical Down Time   1  
00000A Critical Outage    1  
00000A Total Repair Time   65  
00000B Critical Down Time            6 
00000B Critical Outage             3 
00000B Total Repair Time            90 
00000C Critical Down Time   1      5  
00000C Critical Outage    1      5  
00000C Total Repair Time   30     240  
00000D Critical Down Time         2  
00000E Critical Down Time         1  
00000G Critical Down Time         1  
00000M Critical Down Time   1      3  
00000M Critical Outage    1      3  
00000M Total Repair Time   60     180  

мне нужно добавить пустую строку между 00000A и XYXYXY. GridView заполняется из класса bll с использованием DataTable. Я использую метод OnRowCreated для изменения заголовков столбцов и OnRowDataBound для форматирования информации в ячейке.

Я думал, что могу добавить строку в eihter из двух методов событий, но мне кажется, что будет слишком поздно в цикле. Я прав?

Я столкнулся с различными сообщениями, такими как this one и this one, но все они происходят по-разному, например, при нажатии кнопки.

В моем случае единственной константой, на которой я могу зависеть, является наличие или отсутствие трех категорий: время простоя, время восстановления и общее количество. Есть случаи, когда у меня есть только одна или две из трех категорий, и здесь мне нужно вставить строку с соответствующей отсутствующей категорией.

Любые предложения, как это сделать?

Спасибо,

Р.

UPDATE: Я обновил вывод из приведенного выше запроса. Как вы видите, в нижней половине «Критическое время простоя» повторяется 4 раза, поэтому мне нужно перехватить данные и добавить «Критический отступ», «Общее время восстановления» и пустую строку в качестве разделителя.

+0

Добавьте строку в 'DataTable' вместо – Magnus

+0

Все мои Код DataTable выглядит так: DataTable dt = null; dt = CLASS.METHOD (PARAM1, PARAM2, ...); gv.DataSource = dt; и DataBind(); Как добавить строку? – Risho

ответ

1

Вы должны добавить новую строку в DataTable. Например:

Сначала найдите индекс, в который вы хотите вставить новую строку. Это делается с помощью первичного ключа строки (я предполагаю, что ваши строки имеют первичные ключи)

int rowPosition = dt.Rows.IndexOf(dt.Rows.Find([PRIMARY KEY])); 

Затем создать новую строку и вставить его в таблицу:

dt.Rows.InsertAt(dt.NewRow(), rowPosition); 

Затем, вы можете привяжите GridView так же, как и раньше.

UPDATE

После получения еще несколько обновлений с OP, вот решение:

Во-первых, некоторые переменные.

/// <summary> 
/// This holds the number and names of the subcategories that are required for each category. 
/// </summary> 
string[] subCategories = new string[3] { "Critical Down Time", "Critical Outage", "Total Repair Time" }; 
string categoryPrevious = null; 
string categoryCurrent = null; 
int subCategoryOccurences = 0; 
int rowCount = 0; 
DataRow rowFiller = null; 

Вот метод, который получает данные, которые после заполнения из базы данных.

public void PrepareDataTable(DataTable dtResults) 
{ 

    if (dtResults == null || dtResults.Rows.Count == 0) 
     return; 

    //initialize category 
    categoryPrevious = dtResults.Rows[0]["Category"].ToString(); 
    do 
    { 
     //get the current category 
     categoryCurrent = dtResults.Rows[rowCount]["Category"].ToString(); 
     //check if this is a new category. this is where all the work is done 
     if (categoryCurrent != categoryPrevious) 
     { 
      //check if we have fulfilled the requirement for number of subcategories 
      CheckSubCategoryRequirements(dtResults); 
      //at this point we have fulfilled the requirement for number of subcategories 
      //add blank (separator) row 
      dtResults.Rows.InsertAt(dtResults.NewRow(), rowCount); 
      rowCount++; 
      //reset the number of subcategories 
      subCategoryOccurences = 0; 
      categoryPrevious = categoryCurrent; 
     } 
     else 
     { 
      rowCount++; 
      categoryOccurences++; 
     } 
    } while (rowCount < dtResults.Rows.Count); 
    //check sub category requirements for the last category 
    CheckSubCategoryRequirements(dtResults); 

} 

Это метод, который обрабатывает добавление любых отсутствующих подкатегорий.Я извлек код в отдельный метод, так как он вызывается в двух разных местах в коде:

/// <summary> 
/// Checks if a category has fulfilled the requirements for # of sub categories and adds the missing sub categories, if needed 
/// </summary> 
private void CheckSubCategoryRequirements(DataTable dtResults) 
{ 
    if (subCategoryOccurences< subCategories.Length) 
    { 
     //we need to add rows for the missing subcategories 
     while (subCategoryOccurences< subCategories.Length) 
     { 
      //create a new row and populate category and subcategory info 
      rowFiller = dtResults.NewRow(); 
      rowFiller["Category"] = categoryPrevious; 
      rowFiller["SubCategory"] = subCategories[subCategoryOccurences]; 
      //insert the new row into the current location of table 
      dtResults.Rows.InsertAt(rowFiller, rowCount); 
      subCategoryOccurences++; 
      rowCount++; 
     } 
    } 
} 

Наконец, вот «тест Жгут», чтобы проверить код выше:

public void RunTest() 
{ 
    DataTable dtResults = new DataTable(); 
    dtResults.Columns.Add("Category"); 
    dtResults.Columns.Add("SubCategory"); 
    dtResults.Rows.Add("XXXX", "Critical Down Time"); 
    dtResults.Rows.Add("XXXX", "Critical Outage"); 
    dtResults.Rows.Add("XXXX", "Total Repair Time"); 
    dtResults.Rows.Add("YYYY", "Critical Down Time"); 
    dtResults.Rows.Add("YYYY", "Critical Outage"); 
    dtResults.Rows.Add("ZZZZ", "Critical Down Time"); 
    dtResults.Rows.Add("ZZZZ", "Critical Outage"); 
    dtResults.Rows.Add("ZZZZ", "Total Repair Time"); 
    dtResults.Rows.Add("AAAA", "Critical Down Time"); 

    PrepareDataTable(dtResults); 
} 

Я тестировал код и, кажется, работаю согласно вашим требованиям. Дайте мне знать, если я что-то пропустил или какая-то часть неясна.

Вот до и после того, как из DataTable:

Перед

enter image description here

После:

enter image description here

+0

Я думаю, вопрос остается там, где в событиях или жизненном цикле мне нужно это делать? И нет, строки не имеют PK - запрос sproc состоит из инструкции PIVOT, которая получает данные из представления, которое имеет еще три вида, соединенных в UNION. Я отправлял его некоторое время назад, но я думаю, что это либо испугало людей, либо подумал, что я схожу с ума, и никто не ответил. Я могу опубликовать код, но он должен быть утренним утром. – Risho

+0

@Risho Вы добавляете строку в 'DataTable', прежде чем связывать ее с сеткой. Вам не нужно ничего делать с помощью «GridView». – Magnus

+0

Если у вас нет первичного ключа, он по-прежнему выполним, просто немного громоздко. Быстрый вопрос. Является ли случай использования ВСЕГДА добавлять строку между «00000A» и «XYXYXY», или это более общее: я хочу добавить пустую строку между «разделами»? По разделам я имею в виду строки, которые имеют одинаковое значение для первого столбца. –

Смежные вопросы