2011-08-02 21 views
1

GridViewをExcelにエクスポートしようとしましたが、 動的に最後に追加された行がExcelにエクスポートされませんでした。動的に追加された行をExcelにGridviewにエクスポートできません

私は2つのデータセットを最初に持っていますが、データを直接Gridviewにバインドします。

その後、別のデータセットの最後の行を追加します。

ページでは、結果が期待どおりに表示されますが、エクスポートしたときにExcelが表示されません。 GrieViewエクスポートする

#region Add OverallRow 
private void AddOverallRow(DataSet dsgrid) 
{ 
    using (GridViewRow gr = new GridViewRow(RSGScoreCard_Grid.Rows.Count + 1, 0, DataControlRowType.DataRow, DataControlRowState.Normal)) 
    { 
     for (int i = 0; i < 6; i++)//6 is the column count for overall row 
     { 
      using (TableCell tc = new TableCell()) 
      { 
       gr.Cells.Add(tc); 
       if (i == 0) 
       { 
        gr.Cells[i].ColumnSpan = 4; 
        gr.Cells[i].Text = "Overall"; 
        gr.Cells[i].Attributes.Add("class", "fcol"); 
        gr.Cells[i].Attributes.Add("style", "font-weight:bold;padding-left:20%"); 
       } 
       else gr.Cells[i].Attributes.Add("style", "font-weight:bold"); 

      } 
     } 


     if (dsgrid.Tables[1] != null)//creating a dynamic row to gridview 
      if (dsgrid.Tables[1].Rows.Count > 0) 
      { 
       gr.Cells[1].Text = dsgrid.Tables[1].Rows[0][5].ToString(); 
       gr.Cells[1].Width = Unit.Percentage(8); 
       gr.Cells[2].Text = dsgrid.Tables[1].Rows[0][6].ToString(); 
       gr.Cells[2].Width = Unit.Percentage(8); 
       gr.Cells[3].Text = dsgrid.Tables[1].Rows[0][7].ToString(); 
       gr.Cells[3].Width = Unit.Percentage(8); 
       gr.Cells[4].Text = dsgrid.Tables[1].Rows[0][8].ToString(); 
       gr.Cells[4].Width = Unit.Percentage(8); 
       gr.Cells[5].Text = dsgrid.Tables[1].Rows[0][9].ToString(); 
       gr.Cells[5].Width = Unit.Percentage(8); 
      } 
     gr.Attributes.Add("class", "row2"); 

     RSGScoreCard_Grid.Controls[0].Controls.AddAt(RSGScoreCard_Grid.Rows.Count + 1, gr); 


    } 
} 
#endregion 

と私のコードの最終:下部に全体の行を追加

DataSet dsgrid = SqlHelper.ExecuteDataset(DBConnectionString.ConnectionString, CommandType.StoredProcedure, "usp_Training_GetCirclescoreCardReport ", sqlparam); 

    if (TrainingUtil.isDataSetValid(dsgrid)) 
    { 

     RSGScoreCard_Grid.DataSource = dsgrid; 
     RSGScoreCard_Grid.DataBind(); 
     AddOverallRow(dsgrid); 
    } 
    else RSGScoreCard_Grid.DataBind(); 

: 以下の私のコードである

protected void btnExport_Click(object sender, EventArgs e) 
{ 
    TrainingUtil.Export(ddlOptions.SelectedItem.Text.ToString().Replace(" ", string.Empty) + "_" + ddlVerticals.SelectedItem.Text.ToString().Replace(" ", string.Empty) + "_" + ddlLernerGroups.SelectedItem.Text.ToString().Replace(" ", string.Empty), RSGScoreCard_Grid, "For the Month/Year: " + ddlFromMonths.SelectedItem.Text.ToString()+"/"+ddlYears.SelectedItem.Text.ToString(), RSGScoreCard_Grid.HeaderRow.Cells.Count); 
} 
public override void VerifyRenderingInServerForm(Control control) 
{ 
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET 
     server control at run time. */ 
} 

エクスポート方法TrainingUtilクラス内を

#region Export 

public static void Export(string filename, GridView grid, string Heading, int ColumnsCount) 
{ 

    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", filename + ".xls")); 
    HttpContext.Current.Response.ContentType = "application/ms-excel"; 
    using (StringWriter sw = new StringWriter()) 
    { 
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
     { 
      grid.HeaderStyle.BackColor = System.Drawing.Color.Cyan; 
      //Cells color settings 
      GridViewRow row = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Normal); 
      TableCell cell = new TableCell(); 
      cell.Text = String.Format("{0}", Heading); 
      cell.ColumnSpan = ColumnsCount; 
      cell.Attributes.Add("align", "center"); 
      cell.Attributes.Add("class", "yellow"); 
      row.Cells.Add(cell); 
      grid.Controls[0].Controls.AddAt(0, row); 
      foreach (GridViewRow gridRow in grid.Rows) 
      { 
       foreach (TableCell tcGridCells in gridRow.Cells) 
       { 
        tcGridCells.Attributes.Add("class", "sborder"); 
       } 
      } 

      grid.RenderControl(htw); 
      //Add the style sheet class here 
      HttpContext.Current.Response.Write(@"<style> .sborder { color : Black;border : 1px Solid Black; } .yellow {background-color:yellow;color:black;} </style> "); 
      HttpContext.Current.Response.Write(sw.ToString()); 
      HttpContext.Current.Response.End(); 
     } 
    } 

} 
#endregion 

助けてもらえますか?最後の行をエクスポートできない理由は何ですか? ありがとうございました

答えて

2

私はすべてのポストにあなたが動的に追加された行をバインドしないと思います。 ポストバックの原因となっているコントロールを見つけて、もう一度データをバインドしようとします。ポストバック制御の元を見つけるため

コード: -

public static Control GetPostBackControl(Page page) 
{ 
    Control control = null; 

    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if (ctrlname != null && ctrlname != string.Empty) 
    { 
     control = page.FindControl(ctrlname); 
    } 
    else 
    { 
     foreach (string ctl in page.Request.Form) 
     { 
      Control c = page.FindControl(ctl); 
      if (c is System.Web.UI.WebControls.Button) 
      { 
       control = c; 
       break; 
      } 
     } 
    } 
    return control; 
} 
+0

おかげで@Ganesha .ITは私を助けました。 –

+0

こんにちは@Ganeshaのポストバックプロセスについて考えた後、コントロールを見つけてその関数を呼び出すのではなく、ボタンのクリックイベントでコードを直接記述しました。 –

関連する問題