2011-01-20 13 views
1

GridViewチェックボックスに基づいてレポートを印刷したいとします。 3行が選択された場合は、3つのレポートにする必要があります。私のコードは次のようである...ASP.NET GridView、RDLCを使用して複数のレポートを印刷する方法は?

protected void btn_Print_Click(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      try 
      { 
       foreach (GridViewRow gvr in grdRV.Rows) 
       { 
        RadioButton rbID = (RadioButton)gvr.FindControl("rbID") as RadioButton; 

        if (rbID != null && rbID.Checked) 
        { 
         string sID = grdRV.DataKeys[gvr.RowIndex].Value.ToString().Trim(); 

         if (rbl_Print.SelectedValue == "0") 
         { 
          SMTP(sID); 
         } 
         else if (rbl_Print.SelectedValue == "1") 
         { 
          Material(sID); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Session["error"] = ex.Message; 
       Response.Redirect("MessageBoard.aspx"); 
      } 
     } 
    } 

private void Material(string sID) 
    {    

     string querystring = "../pmis/Reports/RptRFQMatV.aspx?RFQNo=" + lblRFQNo.Text.ToString() + "&ID=" + sID; 

     Random r = new Random();    
     string Script = ""; 
     Script += "<script language=JavaScript id='PopupWindow'>"; 
     Script += "confirmWin = window.open(' " + querystring + "','" + r.Next() + "','scrollbars=yes,resizable=1, width=960,height=500,left=50,top=130,status');"; 
     Script += "confirmWin.Setfocus()</script>"; 

     //ClientScript.RegisterStartupScript(typeof(string), "PopupScript", "PopupWindow"); 
     if (!ClientScript.IsClientScriptBlockRegistered("PopupWindow")) 
      ClientScript.RegisterClientScriptBlock(typeof(string), "PopupWindow", Script); 
    } 

現在、このコードは私を助けることができる誰が...最後の行のみをレポート印刷することができますか?ありがとう

+0

このコードでブレークポイントを設定するとどうなりますか?なぜそれはあなたが期待している3つをキャッチしていないのですか? –

+0

@ p.campbell:私は3行をチェックしたとしましょう、私は3つのIDを持っています。たとえば:A0031、A0027、A0051。だから最初にA0031マテリアルブロック、A0027、A0051の後に行く。だから、レポートはA0051のためだけに出てくる。他の2つのIDは出てこない。上書きされるかもしれません... – CMMaung

答えて

2

私はこれをテストして3つのウィンドウを開きます。選択したIDのリストをMaterialに渡すことで少し修正する必要があるので、Materialを一度呼び出すだけです。あなたの文字列操作で材料の内部では、次の行の後、

Script += "<script language=JavaScript id='PopupWindow'>"; 

は、選択のIDかかわらず行き、window.openを追加するためのループを追加します。したがって、次の行はfor/foreachループ内になければなりません。

string querystring = "../pmis/Reports/RptRFQMatV.aspx?RFQNo=" + lblRFQNo.Text.ToString() + "&ID=" + sID; 


Script += "confirmWin = window.open(' " + querystring + "','" + r.Next() + "','scrollbars=yes,resizable=1, width=960,height=500,left=50,top=130,status');"; 

そして、次の行は、forループの外側にあります。

Script += "confirmWin.Setfocus()</script>"; 

     //ClientScript.RegisterStartupScript(typeof(string), "PopupScript", "PopupWindow"); 
     if (!ClientScript.IsClientScriptBlockRegistered("PopupWindow")) 
      ClientScript.RegisterClientScriptBlock(typeof(string), "PopupWindow", Script); 

これは私の例であり、動作します。また、文字列+ =

の代わりにStringBuilderを使用した方が良いでしょう。
 string Script = ""; 
     Script += "<script language=JavaScript id='PopupWindow'>"; 
     Script += "window.open('www.google.com.au', '1','scrollbars=yes,resizable=1, width=960,height=500,left=50,top=130,status');"; 
     Script += "window.open('www.yahoo.com','2','scrollbars=yes,resizable=1, width=960,height=500,left=50,top=130,status');"; 
     Script += "window.open('www.stackoverflow.com','3', 'scrollbars=yes,resizable=1, width=960,height=500,left=50,top=130,status');"; 
     Script += "</script>"; 

     if (!ClientScript.IsClientScriptBlockRegistered("PopupWindow")) 
      ClientScript.RegisterClientScriptBlock(typeof(string), "PopupWindow", Script); 

希望します。

+0

@CMMaung:私の例は、概念の証明であるので、静的データを使用しています。あなたが私の例の上に私の指示を読んだら、あなたは大丈夫と思う。そして、このコードがサーバー側を実行し、応答が最終的にクライアント側に達すると、常に1つのウィンドウを開くように、ループ全体が終了したときにウィンドウが開かれた場合、どのように重要か理解できません。たぶん私はあなたの要件を完全に理解していないでしょう。 – Divi

関連する問題