none
設計報表時一定就要選定資料來源,不能只宣告變數名稱,再從程式端丟入嗎 RRS feed

  • 問題

  • 我在報表裏的Section3(細目)裏有一參數欄位Name = 'City',但是執行時卻永遠只出現第一筆的的資料而已????

    或者是我在設計報表時一定就要選定資料來源,不能只宣告變數名稱,再從程式端丟入

    public partial class Form1 : Form
        {
            private const string PARAMETER_FIELD_NAME = "City";
          
            public Form1()
            {
               InitializeComponent();           
                ArrayList arrayList = new ArrayList();
                arrayList.Add("Paris");
                arrayList.Add("Tokyo");
                this.crystalReportViewer1.ReportSource = "D:\\Program\\test\\CustomersByCity.rpt";
                //this.crystalReportViewer1.ReportSource = Application.StartupPath + "\\" + "CustomersByCity.rpt";
                ParameterFields parameterFields = crystalReportViewer1.ParameterFieldInfo;
                SetCurrentValuesForParameterField(parameterFields, arrayList);
            }
            private void SetCurrentValuesForParameterField(ParameterFields parameterFields, ArrayList arrayList)
            {
                ParameterValues currentParameterValues = new ParameterValues();
                foreach (object submittedValue in arrayList)
                {
                    ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
                    parameterDiscreteValue.Value = submittedValue.ToString();
                    currentParameterValues.Add(parameterDiscreteValue);
                }
                ParameterField parameterField = parameterFields[PARAMETER_FIELD_NAME];
                parameterField.CurrentValues = currentParameterValues;
            }
        }

    2006年9月30日 上午 05:29

解答

  • HI,

    當您為專案加入CrystalReport報表時, 專案中會多出一個副檔名為rpt的檔案, 其實Visual Studio會順利建立一個代表這個報表的類別(例如叫做CrystalReport1), 接下來您可以利用CrystalReport1類別產生物件, 例如:

    CrystalReport1 cr=new CrystalReport1();

    然後就可以呼叫CrystalReport1類別的物件的SetDataSource方法:

    cr.SetDataSource(DataSet物件);     //先利用參數查出欲列印的記錄並放入到DataSet物件

    最後再將CrystalReport物件拿給CrystalReportViewer控制項預覽即可:

    CrystalReportViewer物件.ReportSource=cr;

    tihs

    2006年10月2日 上午 02:35

所有回覆

  • HI,

    我沒有實際執行您的程式, 不過以下的程式乍看之下有一點怪怪的, 如果有看錯還請見諒:

    private void SetCurrentValuesForParameterField(ParameterFields parameterFields, ArrayList arrayList)
            {
                ParameterValues currentParameterValues = new ParameterValues(); //好像只有一個currentParameterValues變數
                foreach (object submittedValue in arrayList)
                {
                    ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
                    parameterDiscreteValue.Value = submittedValue.ToString();
                    currentParameterValues.Add(parameterDiscreteValue);      //但是填入內容兩次
                }
                ParameterField parameterField = parameterFields[PARAMETER_FIELD_NAME];
                parameterField.CurrentValues = currentParameterValues;
            }

    這樣是否會將第一個填入的內容蓋掉?

    tihs

    2006年10月1日 上午 01:36
  • 謝謝您的回覆

    currentParameterValues及parameterField也會變成一個array,

    但parameterField.CurrentValues卻永遠只會印出一個,所以在想是不是我用錯方式,不該用這個方法控制列印的變數

    我只是想要.rpt和程式之間原本是沒什麼關聯,當程式要用到時再指定是那個rpt,而程式的某一資料欄是要丟到rpt的那個變數

    如此,在設計rpt時,我不須考慮我已事先產生可讓此rpt可用的來源沒,

     

    2006年10月1日 下午 04:04
  • HI,

    真是不好意思, 恕我眼拙看錯了,

    我在使用Crystal Report時, 是利用Crystal Report報表產生的類別建立報表物件, 再呼叫報表物件的SetDataSource方法設定欲列印的記錄(利用參數準備好欲列印的記錄內容), 最後再拿給CrystalReportViewer進行預覽, 這樣的做法可以成功地印出利用參數查出的記錄

    tihs

    2006年10月2日 上午 12:45
  • 非常謝謝你!

    但因所知的不足,所以不太了解要從何下手,是否可再詳細一點,謝謝!

     

    2006年10月2日 上午 01:14
  • HI,

    當您為專案加入CrystalReport報表時, 專案中會多出一個副檔名為rpt的檔案, 其實Visual Studio會順利建立一個代表這個報表的類別(例如叫做CrystalReport1), 接下來您可以利用CrystalReport1類別產生物件, 例如:

    CrystalReport1 cr=new CrystalReport1();

    然後就可以呼叫CrystalReport1類別的物件的SetDataSource方法:

    cr.SetDataSource(DataSet物件);     //先利用參數查出欲列印的記錄並放入到DataSet物件

    最後再將CrystalReport物件拿給CrystalReportViewer控制項預覽即可:

    CrystalReportViewer物件.ReportSource=cr;

    tihs

    2006年10月2日 上午 02:35
  • 你好,

    當我執行到 cr.SetDataSource(ds) 時,出現例外訊息為:報表沒有資料表。

    .rpt檔我是用產生空白報表,之後放入一個參數欄位A,而我的ds也只select 出A欄位而已

     

    2006年10月2日 上午 03:26
  • 你的報表如果沒有資料來源那報表要如何判斷有多少筆資料要跑多少頁呢....
    2006年10月2日 上午 03:51
  • 你好,

    謝謝你的回覆,所以我的問題是在rpt裏我只給予變數名稱如custname,tel....

    而資料來源是要呼叫rpt時在cs裏才給序,所以就算我的rpt的抬頭是"客戶資料",但其顯示的內容是有可能根據程式異動而異動

    而在cs裏給予資料來源後就和事先在rpt裏給予資料來源的操作是一樣了

    2006年10月2日 上午 04:01
  • 謝謝各位的幫忙,目前決定先照既有的report規則完成,自己再找時間測試

     

     

    2006年10月2日 下午 02:20