在存在特定条件时自动向gridview添加行

时间:2013-02-27 21:56:46

标签: c# asp.net

我需要在gridview中添加一行,其中AutoGenerateColumns =“true”。这是诀窍。 SQL查询以这种方式编写(使用数据透视),它以三个为一组返回记录,如下所示:

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使用DataTable从bll类填充。我正在利用OnRowCreated方法修改列标题和OnRowDataBound来格式化单元格中的信息。

我认为我可以在两种事件方法中添加一行,但在我看来,它在周期中已经太晚了。我是对的?

我遇到过各种帖子,例如this onethis one,但他们都以不同的方式进行,例如按钮点击事件。

在我的情况下,我可以依赖的唯一常数是三种类别的存在或缺失:停机时间,维修时间和总数。有些情况下我只有三个类别中的一个或两个,这就是我需要插入一个具有相应缺失类别的行。

有任何建议如何去做?

谢谢,

R上。

更新:我已经更新了上面查询的输出。正如您在下半部分看到的那样,“严重停机时间”被重复4次,因此我需要拦截数据并添加“关键停机”,“总修复时间”和空白行作为分隔符。

1 个答案:

答案 0 :(得分:1)

您应该向DataTable添加新行。像这样:

首先,找到要插入新行的索引。这是使用行的主键完成的(我假设你的行有主键)

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

然后创建一个新行并将其插入表中:

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

然后,您可以像以前一样绑定GridView。

<强>更新

从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);
}

我已经测试了代码,它似乎符合您的要求。如果我遗漏了某些内容或者有任何部分不清楚,请告诉我。

这是数据表的前后:

enter image description here

后:

enter image description here