我需要在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 one和this one,但他们都以不同的方式进行,例如按钮点击事件。
在我的情况下,我可以依赖的唯一常数是三种类别的存在或缺失:停机时间,维修时间和总数。有些情况下我只有三个类别中的一个或两个,这就是我需要插入一个具有相应缺失类别的行。
有任何建议如何去做?
谢谢,
R上。
更新:我已经更新了上面查询的输出。正如您在下半部分看到的那样,“严重停机时间”被重复4次,因此我需要拦截数据并添加“关键停机”,“总修复时间”和空白行作为分隔符。
答案 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);
}
我已经测试了代码,它似乎符合您的要求。如果我遗漏了某些内容或者有任何部分不清楚,请告诉我。
这是数据表的前后:
在
后: