0

AutoGenerateColumns="true" を持つグリッドビューに行を追加する必要があります。ただし、ここにトリックがあります。SQL クエリは、以下に示すように、3 つのグループでレコードを返すように (ピボットを使用して) 記述されています。

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 を使用してセル内の情報をフォーマットしています。

2 つのイベント メソッドのいずれかに行を追加できると思っていましたが、サイクルが遅すぎるようです。私はそうですよね?

これこれのようなさまざまな投稿に出くわしましたが、ボタンクリックイベントなど、すべて異なる方法で行っています。

私の場合、信頼できる唯一の定数は、ダウン タイム、修理時間、および合計の 3 つのカテゴリの有無です。3 つのカテゴリのうち 1 つまたは 2 つしかない場合があり、これは、対応する欠落しているカテゴリを含む行を挿入する必要がある場所です。

どのようにそれを行うかについての提案はありますか?

ありがとう、

R.

更新: 上記のクエリの出力を更新しました。下半分に見られるように、「重大なダウン時間」が 4 回繰り返されるため、データを傍受して「重大な停止」、「合計修復時間」、およびセパレーターとして空白行を追加する必要があります。

4

1 に答える 1

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

}

これは、欠落しているサブカテゴリの追加を処理するメソッドです。コード内の 2 つの別々の場所で呼び出されるため、コードを別のメソッドに抽出しました。

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

コードをテストしましたが、要件に従って動作しているようです。何かを見逃したり、不明な部分があれば教えてください。

データテーブルの前後は次のとおりです。

ここに画像の説明を入力

後:

ここに画像の説明を入力

于 2013-02-27T22:53:43.113 に答える