1

グリッドビューの列に行として表示される次のコードがあります。

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    gvOrdersProcessed.DataSource = FlipDataTable(BindOrdersProcessed());
    gvOrdersProcessed.DataBind();
}

public DataTable BindOrdersProcessed()
{
    SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["WO_StatusConnectionString"].ToString());
    SqlCommand Cmd = new SqlCommand("sp_B2B_GetOrdersProcessed", Conn);
    Cmd.CommandType = CommandType.StoredProcedure;           

    SqlDataAdapter ada = new SqlDataAdapter(Cmd);
    DataTable dt = new DataTable();
    ada.Fill(dt);
    return dt;
}

public DataTable FlipDataTable(DataTable dt)
{
     DataTable table = new DataTable();

     //Get all the rows and change into columns
     for (int i = 0; i <= dt.Rows.Count; i++)            
         table.Columns.Add(Convert.ToString(i));            

     DataRow dr;

     //get all the columns and make it as rows
     for (int j = 0; j < dt.Columns.Count; j++)
     {
          dr = table.NewRow();
          dr[0] = dt.Columns[j].ToString();
          for (int k = 1; k <= dt.Rows.Count; k++)
              dr[k] = dt.Rows[k - 1][j];
          table.Rows.Add(dr);
     }

     return table;
}

そして私のhtmlで:

<div id="GridOrdersProcessed">
        <asp:GridView ID="gvOrdersProcessed" runat="server">
        </asp:GridView>
    </div>  

上記を実行すると、ヘッダーとして数字が表示されます。

0                    1          2          3          4          5          6 
DateCreate           02/11/2013 02/19/2013 02/21/2013 02/25/2013 02/26/2013 02/27/2013 
OrdersPendingInvoice 0          0          0          0          0          0 
OrdersPendingPickUp  1          1          2          1          7          9 

なぜそれが起こっているのですか?

また、次のように合計注文数を含む新しい列を追加するにはどうすればよいですか。

DateCreate           Total 02/11/2013 02/19/2013 02/21/2013 02/25/2013 02/26/2013 02/27/2013 
OrdersPendingInvoice 0     0          0          0          0          0          0 
OrdersPendingPickUp  21    1          1          2          1          7          9
4

1 に答える 1

1

ここで数値名を使用してDataColumnsを作成したため、ヘッダーとして数値を取得しています。

public DataTable FlipDataTable(DataTable dt)
{
    DataTable table = new DataTable();
    //Get all the rows and change into columns
    for (int i = 0; i <= dt.Rows.Count; i++)
        table.Columns.Add(Convert.ToString(i));

あなたはおそらくこのような何かが欲しいでしょう:

for (int i = 0; i < dt.Rows.Count; i++) 
     table.Columns.Add(Convert.ToString(dt.Rows[i][0]));

ループ内でに変更<=したことにも注意してください。i <

編集:しかし、私はメソッドが本来の機能を果たさないのではないかと心配しています(ピボットとも呼ばれる行と列の役割を逆にします)。

この拡張メソッドを使用できます。

public static DataTable Pivot(this DataTable tbl)
{
    var tblPivot = new DataTable();
    tblPivot.Columns.Add(tbl.Columns[0].ColumnName);
    for (int i = 1; i < tbl.Rows.Count; i++)
    {
        tblPivot.Columns.Add(Convert.ToString(i));
    }
    for (int col = 0; col < tbl.Columns.Count; col++)
    {
        var r = tblPivot.NewRow();
        r[0] = tbl.Columns[col].ToString();
        for (int j = 1; j < tbl.Rows.Count; j++)
            r[j] = tbl.Rows[j][col];

        tblPivot.Rows.Add(r);
    }
    return tblPivot;
}

更新多分、このlinqクエリは、テーブルをピボットする前に合計列を取得するのに役立ちます。

int OrdersPendingInvoiceTotal= tbl.AsEnumerable()
    .Sum(r => r.Field<int>("OrdersPendingInvoice"));
int OrdersPendingPickUpTotal= tbl.AsEnumerable()
    .Sum(r => r.Field<int>("OrdersPendingPickUp"));
于 2013-02-27T20:05:23.337 に答える