最近公司接了一個項目,要給客戶做許多報表,并且是中國式的報表,本人就用了c#+水晶報表10進行了開發,但是中間遇到了一個問題,” 動态設定水晶報表的資料源後,列印、導出、查找等按鈕不能用, 即使用水晶報表的工具欄時,出現的不是列印、導出、查找的結果,而是一張空白” 。出現這個問題挺郁悶的,于是在網上也查找了一番,但是網友們也都遇見到這個問題,都 沒有給出解決的辦法。無奈之下,本人專門研究了一番,最後 費了十牛三虎之力,終于找到了解決的辦法,下面列出來,以飨讀者,希望能給遇到此問題的朋友一定的幫助。 WEB 窗體中有兩個控件, CrystalReportViewer1 和 CrystalReportSource1 , 資料源: Dataset 代碼 : protected CrystalDecisions.Web.CrystalReportViewer Crv; ReportDocument ReportDoc=new ReportDocument() ; if (!IsPostBack) { SqlConnection sqlConnData=new SqlConnection(ConfigurationSettings.AppSettings["dsn"]) ; sqlConnData.Open(); string str="select * from brigderoad where (station='"+UserStr+"') or (year='"+yearStr+"') "; // 查詢特定的表 SqlDataAdapter MyAdapter=new SqlDataAdapter (str,sqlConnData); addressDS ds=new addressDS(); MyAdapter.Fill (ds,"brigderoad");// 綁定到資料源 string FilePath=Server.MapPath("report/bridgeCrR.rpt"); // 指定到特定的報表 if (!ReportDoc.IsLoaded ) ReportDoc.Load(FilePath); ReportDoc.SetDataSource(ds); Crv.ReportSource=ReportDoc; } 上面就是常見的代碼,并且代碼不存在錯誤,那讀者要問了,上面沒有錯誤,但是到預覽報表時,要列印、導出、查找特定的頁面時為什麼還是空白頁面呢? 哈哈,下面将解決這個問題,請往下看 if (!IsPostBack) { // } SqlConnection sqlConnData=new SqlConnection(ConfigurationSettings.AppSettings["dsn"]) ; sqlConnData.Open(); string str="select * from brigderoad where (station='"+UserStr+"') or (year='"+yearStr+"') "; // 查詢特定的表 SqlDataAdapter MyAdapter=new SqlDataAdapter (str,sqlConnData); addressDS ds=new addressDS(); MyAdapter.Fill (ds,"brigderoad");// 綁定到資料源 string FilePath=Server.MapPath("report/bridgeCrR.rpt"); // 指定到特定的報表 if (!ReportDoc.IsLoaded ) ReportDoc.Load(FilePath); ReportDoc.SetDataSource(ds); Crv.ReportSource=ReportDoc; 看到了吧,隻需要 if 語句後的代碼放在 if (!IsPostBack){ //} 的後面就可以了,呵呵,啰唆了那麼多,就這麼簡單。 Ispostback 訓示該頁是否正為響應用戶端回發而加載,或者它是否正被首次加載和通路,當執行完 if (!IsPostBack){ //} 之後有比訊把所查詢的表重新綁定資料源,這樣報表中有了資料,是以水晶報表的工具欄就可以用了。 總結 : if (!IsPostBack){ //} 執行之後要把表重新綁定到資料源,這樣才不會錯誤。