none
VC# フォームから レポートのテキストボックス 表示 非表示 RRS feed

  • 質問

  • VC#2010proでフォームにCrystalReportsViewを配置してデータが表示されるところまではできていますが、
    さらに、フォームにcheckboxを配置してCrystalReportsView上のFormula Fieldsの表示・非表示を
    行いたいのですが下記checkBox1_CheckedChangedでcheckを入れる・はずすの動作で
    CrvCertificates.制御したいFormula Fields.visible = True;
    CrvCertificates.制御したいFormula Fields.visible = False;
    のようにしたいのですが、書き方がわかりません。

    どなたか、よろしくお願いいたします。

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
          //// Create a CrCertificates object 
          CrCertificates myReport = new CrCertificates();
    
          ParameterField parField = new ParameterField();
          ParameterFields parFields = new ParameterFields();
          ParameterDiscreteValue parDiscreateValue = new ParameterDiscreteValue();
          parField.Name = "ParTitle";
          parDiscreateValue.Value = cmb_r_id.Text;
          parField.CurrentValues.Add(parDiscreateValue);
          parFields.Add(parField);
          CrvCertificates.ParameterFieldInfo = parFields;
          
          //// Set the DataSource of the report 
          myReport.SetDataSource(Newds);
    
          //// Set the Report Source to ReportView 
          CrvCertificates.ReportSource = myReport;
    
        }
    

    2010年10月26日 11:19

回答

  • ParameterFieldsオブジェクトをCrvCertificatesのParameterFieldInfoプロパティに渡すわけですが、コンボボックスのパラメーターを渡した後に、チェックボックスのパラメーターを渡しているため、結果的にコンボボックスのパラメーターが上書きされてしまい、それが渡されていないのが原因だと思います。一つのParameterFieldsオブジェクトに、コンボボックスとチェックボックスのパラメーターをAddし、それをレポートに渡すようにすればうまくいくと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク oira3ryu 2010年11月1日 14:11
    2010年11月1日 1:20
    モデレータ

すべての返信

  • Crystal ReportsはVS2010に対応したベータ版をお使いでしょうか? であれば、私はまだ試していないので詳細はわからないのですが、これまでの経験で言えば以下のようにすれば可能だと思われます。

    1.レポートのデザイン画面において、当該のFormula Fieldsを右クリックし、「オブジェクトの書式設定」

    2.「共通」タブに「非表示」があるので、その横の「式ワークショップ」のボタンを押す。

    3.そこでパラメーターとして渡されたチェックボックスの状態によって、trueもしくはfalseを返すようにする。

    #VS2010正式対応のCrystal Reportsがリリースされれば本格的に試そうと思っているのですが、まだみたいですね・・・

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月27日 1:44
    モデレータ
  • trqapemiyaさん、たびたびお世話になります。

     

    > 3.そこでパラメーターとして渡されたチェックボックスの状態によって、trueもしくはfalseを返すようにする。

    というのは、ParameterFieldInfoで渡された値を利用するということなのでしょうか?

    やりたいことは、

    if (checkBox1.Checked == true) {  レポート名.Formula Fieldsコントロール.visible = true;

    }

    else { レポート名.Formula Fieldsコントロール.visible = false;
    }

    のようなイメージなのですけど、フォームからレポートのコントロールは直接参照できないのでしょうか?

    /* 壁にぶち当たりすぎて、心が折れそう。。。*/

    2010年10月28日 11:42
  • というのは、ParameterFieldInfoで渡された値を利用するということなのでしょうか?

    その通りです。以下が参考になると思います。

    Crystal Reports 項目の表示・非表示の切り替え
    http://d.hatena.ne.jp/haradago/20090805/p1

    フォームからレポートのコントロールは参照できないと思います。
    基本的にはレポートが実際に生成される際に、式ワークショップで与えられた条件によって、表示、非表示を制御する仕組みです。したがって、データ毎に表示、非表示を動的に変更することができます。このように考え方として、レポート側で制御するというのが原則だと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月28日 15:17
    モデレータ
  • trapemiyaさん、参考リンクありがとうございました。

    checkboxの表示・非表示が解決できたと思いきや

    今度は、それまで表示できていたコンボボックスのリストから選択して

    パラメータフィールドを使ってレポートのフィールドへ反映していた部分が表示できなくなってしまい

    Enter Parameter Values というEnter partitle1:の入力を要求するフォームが開いてしまうようになってしまいました(汗;

    具体的なコードは

     

     //コンボボックスのパラメータを渡す
    
       ParameterField parField = new ParameterField();
       ParameterFields parFields = new ParameterFields();
       ParameterDiscreteValue paramDiscreateValue = new ParameterDiscreteValue();
       parField.Name = "ParTitle";
       paramDiscreateValue.Value = cmb_r_id.Text;
       parField.CurrentValues.Add(paramDiscreateValue);
       parFields.Add(parField);
       CrvCertificates.ParameterFieldInfo = parFields;
    
        
    
     //チェックボックスのパラメータを渡す
    
       ParameterField parFieldChk = new ParameterField();
       ParameterFields parFieldsChk = new ParameterFields();
       ParameterDiscreteValue parDiscreateValueChk = new ParameterDiscreteValue();
       parFieldChk.Name = "checkbox1";
       parDiscreateValueChk.Value = checkbox1.Checked;
       parFieldChk.CurrentValues.Add(parDiscreateValueChk);
       parFieldsChk.Add(parFieldChk);
       CrvCertificates.ParameterFieldInfo = parFieldsChk;
    

     

    なのですが、レポートにはパラメータフィールドとして

    ?ParTitle

    ?checkbox1

    を配置してあります。

    • 編集済み oira3ryu 2010年10月31日 13:29 余計なHTMLコードが混ざったので訂正
    2010年10月31日 13:27
  • ParameterFieldsオブジェクトをCrvCertificatesのParameterFieldInfoプロパティに渡すわけですが、コンボボックスのパラメーターを渡した後に、チェックボックスのパラメーターを渡しているため、結果的にコンボボックスのパラメーターが上書きされてしまい、それが渡されていないのが原因だと思います。一つのParameterFieldsオブジェクトに、コンボボックスとチェックボックスのパラメーターをAddし、それをレポートに渡すようにすればうまくいくと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク oira3ryu 2010年11月1日 14:11
    2010年11月1日 1:20
    モデレータ
  • trapemiyaさん、いつも的確なアドバイスありがとうございます!

    http://msdn.microsoft.com/ja-jp/library/aa289936(v=VS.71).aspx

    // paramField 変数は new に設定されるので、

    // 以前の設定は上書きされません。 paramField = new ParameterField ();

    を参考に

     

          CrCertificates myReport = new CrCertificates();
    
          ParameterFields paramFields = new ParameterFields();
          ParameterField paramField = new ParameterField();
          ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
          ParameterRangeValue rangeVal = new ParameterRangeValue();
    
          paramField.ParameterFieldName = "partitle1";
          discreteVal.Value = cmb_r_id.Text;
          paramField.CurrentValues.Add(discreteVal);
          paramFields.Add(paramField);
    
          paramField = new ParameterField();
          paramField.ParameterFieldName = "checkbox1";
          discreteVal = new ParameterDiscreteValue();
          discreteVal.Value = checkbox1.Checked;
          paramField.CurrentValues.Add(discreteVal);
          paramFields.Add(paramField);
    
          CrvCertificates.ParameterFieldInfo = paramFields;
    
          myReport.SetDataSource(Newds);
    
          CrvCertificates.ReportSource = myReport;
    
    とすることで、希望通りにできました。 ありがとうございました。
    2010年11月1日 14:11
  • すみません。大嘘を言っていました。ごめんなさい。C#からレポートのオブジェクトの参照を得ることができます。例えばテキストオブジェクトの場合、次のようにします。

    (TextObject)レポートのインスタンス.ReportDefinition.ReportObjects["レポート上のオブジェクト名"]

    ただし、私が見たところ、表示に関するプロパティはありませんでした。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年11月2日 8:18
    モデレータ
  • trapemiyaさん、わざわざありがとうございました。

     

    (TextObject)レポートのインスタンス.ReportDefinition.ReportObjects["レポート上のオブジェクト名"]
    

     

    今後、活用する場面があるかもしれませんので、こういう情報はありがたいです。

    さて、便乗質問てきになってしまうので恐縮なのですが

    今回のような方法だと、チェックボックスのtrue/falseは、

    全レコードに反映されてしまい、イベント発生時に最初のレコードに戻ってしますのですが

    これを、この現在のレコード(カーソル?)を保持する方法はあるでしょうか?

    それと、この動的なパラメーターをレコードごとに保持するとなると

    やはり、レコードにフィールドを設けて保持させるという形になるのでしょうか?

    設計にもよるのでしょうが、ご意見をを聞かせください。

    • 編集済み oira3ryu 2010年11月2日 11:07 編集途中に投稿してしまいました
    2010年11月2日 11:04
  • 今後、活用する場面があるかもしれませんので、こういう情報はありがたいです。

    ありがとうございます。そう言っていただけると助かります。以下辺りにヘルプがあります。

    ReportObjects メンバ
    http://msdn.microsoft.com/ja-jp/library/ms226138(VS.80).aspx

    今回のような方法だと、チェックボックスのtrue/falseは、

    全レコードに反映されてしまい、イベント発生時に最初のレコードに戻ってしますのですが

    これを、この現在のレコード(カーソル?)を保持する方法はあるでしょうか?

    すみません、イベントが何のイベントを指されているのかわかりませんでした。また、最初のレコードに戻るの意味もちょっとわかりませんでした。
    なお、今回の方法ですとレコード単位ではなく、レポートにおけるオブジェクトへの直接的な一度きりの設定になりますから、レコード毎にチェックボックスのtrue/falseを反映させることはできないと思います。

    それと、この動的なパラメーターをレコードごとに保持するとなると

    やはり、レコードにフィールドを設けて保持させるという形になるのでしょうか?

    基本的に流し込まれたデータからレポートが動的に生成されますので、そうなると思います。例えばデータテーブルに制御用の列を追加し、その列の値によってグループヘッダーを出したり、行の色を変えた経験があります。 

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年11月2日 15:59
    モデレータ
  • trapemiyaさん、ご説明ありがとうございました。

    基本的に流し込まれたデータからレポートが動的に生成されますので、そうなると思います。例えばデータテーブルに制御用の列を追加し、その列の値によってグループヘッダーを出したり、行の色を変えた経験があります。

    やはりですか、大変参考になりました。

    ... イベント発生時に最初のレコードに戻ってしまうのですが...

    わかりにくい質問をしてしまい、失礼いたしました。

    この件については、もう少し自力でがんばってみます。

    でも、改めて別スレッドを建てさせていただくかもしれませんので

    その際は、またよろしければおねがいいたします。

    • 編集済み oira3ryu 2010年11月3日 9:33 誤字を訂正
    2010年11月3日 6:21