none
動態加入ReportViewer問題 RRS feed

  • 問題

  • Dear All;
           事情是這樣的,有個報表需要動態加入ReportViewer在網頁畫面上
    報表的部份採用是RDLC
       
      程式裡動態加入ReportViewer是OK的,目前有個問題無解,就是當一次下完成條件後
    產生的資料顯示出來沒有錯,但再下新的條件後,報表內容就都沒有更新
    ,目前查的結果是程式丟的DataTable每次都有依條件產生新的內容
    ,但
    rptview.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("rpt_rptdatatable",dt2));

    rptdatatable <---這個DataTable卻都一直是第一次RUN完的結果

    PS:
    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.LocalReport.Refresh();
    也都有做

    部份程式碼如下

    Microsoft.Reporting.WebForms.ReportViewer rptview = new Microsoft.Reporting.WebForms.ReportViewer();
    
    rptview.LocalReport.ReportPath = Server.MapPath("rpt.rdlc");
    rptview.LocalReport.DataSources.Clear();
    rptview.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("rpt_rptdatatable",dt2));
    
    rptview.LocalReport.Refresh();
    cellc.Controls.Add(rptview);
    row.Controls.Add(cellc);
    dc2.Connection.Close();
    Table1.Controls.Add(row);
    rptview.LocalReport.Dispose();








     

    • 已變更類型 Lolota Lee 2009年5月19日 上午 01:45 使用者自行解決
    • 已變更類型 Lolota Lee 2009年5月20日 上午 01:18 got answer from user.
    2009年5月15日 上午 07:56

解答

  • Hi Lolota;
            問題己解了,原因在於new 了 reportviewer之後,應該要即時add的進去,不然Refresh是沒有用的
    ,後來我仔細想想,應該也是要這樣才對,當this.Panel1.Controls.Add(rptview)這時候rptview才有真正被創建出來
    後續的相關屬性才會發揮作用



    感謝你之前的協助囉
    • 已標示為解答 Lolota Lee 2009年5月20日 上午 01:18
    2009年5月19日 上午 10:53

所有回覆

  • 伊恩:
        先 DataSources.Clear() 
        再 DataSorces.Add()
    2009年5月15日 下午 05:11
    版主
  • hi bill;
            上面的程式碼是有先Clear再Add
    2009年5月17日 上午 08:15
  • 伊恩:
       Sorry,我沒注意到,不過剛試Run了一下並不會有你說的問題.
        因為只有部份程式,我猜一下你在 page_Load時是不是就有呼叫第一次產生ReportViewer的內容
        而卻沒有使用Page.IsPostBack屬性去避免第二次呼叫的時候再次呼叫.
    2009年5月17日 下午 04:34
    版主
  • Hi,

    為什麼會有多一段rptview.LocalReport.Dispose(); ?

    這個Dispose的用法, 或許您要再參考一下MSDN的說明:
    http://msdn.microsoft.com/zh-tw/library/fs2xkftw.aspx


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年5月18日 上午 01:08
  • Hi bill;
            
           嗯..那我再看一下完整程式好了,因為是同事發生的問題, 我倒沒仔細去注意到是否在其它事件它有做了什麼事
           感謝你喔


    hi Lolota :
          會下Dispose(),只是想要該物件的生命週期更確實一些而己,因為ReportVeiw它是在程式裡動態New出來,想說當一個完整的使用完之後就Dispose()掉




    2009年5月18日 上午 01:50
  • 目前測試的結果,在第二次下條件時,reportview裡的Data依舊未能更新
    程式碼如附
    DataTable master_dt = new DataTable();
            DataTable detail_dt = new DataTable();
            SqlDataAdapter da;
            SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DBconnStr"].ToString());
            SqlCommand command = new SqlCommand();
            conn.Open();
            command.Connection = conn;
            command.CommandText = "select distinct cardtype from sales.creditcard ";
            da = new SqlDataAdapter(command);
            da.Fill(master_dt);
            da.Dispose();
            command.Connection.Close();
            conn.Close();
    
            for (int i = 0; i < master_dt.Rows.Count; i++)
            {
                conn.Open();
                command.Connection = conn;
                if (this.DropDownList1.SelectedValue != "ALL")
                    command.CommandText = "select cardtype,ExpYear,count(*) cnt from sales.creditcard where cardtype='" + master_dt.Rows[i]["cardtype"].ToString() + "' and ExpYear='" + this.DropDownList1.SelectedValue + "' group by cardtype,ExpYear  order by ExpYear";
                else
                    command.CommandText = "select cardtype,ExpYear,count(*) cnt from sales.creditcard where cardtype='" + master_dt.Rows[i]["cardtype"].ToString() + "' group by cardtype,ExpYear  order by ExpYear";
                da = new SqlDataAdapter(command);
                detail_dt = new DataTable();
                da.Fill(detail_dt);
                Microsoft.Reporting.WebForms.ReportViewer rptview = new Microsoft.Reporting.WebForms.ReportViewer();
                rptview.LocalReport.ReportPath = Server.MapPath("DynamicReport.rdlc");
                rptview.LocalReport.DataSources.Clear();
                rptview.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("Report_DataSet_DynamicReport", detail_dt));
                rptview.LocalReport.Refresh();
                this.Panel1.Controls.Add(rptview);
                da.Dispose();
                detail_dt.Dispose();
                conn.Close();
            }
    2009年5月19日 上午 08:12
  • 把這兩行對調看看:

    this.Panel1.Controls.Add(rptview);

    rptview.LocalReport.Refresh();
             
    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年5月19日 上午 08:23
  • Hi Lolota;
     有試過,但情況依舊,目前測的結果都感覺像是Report_DataSet_DynamicReport這裡的DataTable未能更新
    保留為第一次查詢的資料內容,但程式要丟進去的detail_dt是確實有依據每次的條件產生正確的資料
    2009年5月19日 上午 08:49
  • Hi Lolota;
            問題己解了,原因在於new 了 reportviewer之後,應該要即時add的進去,不然Refresh是沒有用的
    ,後來我仔細想想,應該也是要這樣才對,當this.Panel1.Controls.Add(rptview)這時候rptview才有真正被創建出來
    後續的相關屬性才會發揮作用



    感謝你之前的協助囉
    • 已標示為解答 Lolota Lee 2009年5月20日 上午 01:18
    2009年5月19日 上午 10:53