2014-02-25 56 views
0

我已經創建的窗口形成充當報告裝載機。我還通過報告嚮導創建了兩個RDLC報告,並自動爲這兩個報告創建數據集。現在我有兩個數據集:sparcsn4DataSet.xsd和sparcsn4DataSet1.xsd正在使用存儲的過程和將兩個參數(dateFrom/dateTo)方法。我有根據狀態結合數據集的一個問題:如何動態綁定的數據源的ReportViewer Windows窗體C#

if (idRep.Equals("extraMove")) 

這是很容易綁定數據集reportview,如果你有一個報告。

Binding 但是如果你有一個以上的?我總是可以用另一個報表查看器創建另一個表單,但這不是一個選項(如果有10個報表/數據集,該怎麼辦),這絕對沒有問題?

應該有綁定數據集的ReportViewer ......有沒有人有想法的方式,我怎麼可以根據情況解決綁定問題?

if (idRep.Equals("extraMove")) 
     { 
      this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport, d1,d2); 
     } 
     else if (idRep.Equals("stripStuff")) 
     { 
      this.AGCT_StripStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_StripStuffReport, d1, d2); 
     } 
     else 
     { 
      MessageBox.Show("Ooops, something went wrong...!"); 
     } 

這是有它的ReportViewer ReportForm.cs:

namespace NavisReportLoader 
{ 
    public partial class ReportForm : Form 
    { 
    public DateTime d1; 
    public DateTime d2; 
    public string dat1; 
    public string dat2; 
    public string idRep; 
    public ReportForm() 
    { 
     InitializeComponent(); 
    } 
    public void passParam(string dateFrom, string dateTo, string date1, string date2) 
    { 
     //ispravi ovo 
     d1 = Convert.ToDateTime(dateFrom); 
     d2 = Convert.ToDateTime(dateTo); 
     dat1 = date1; 
     dat2 = date2; 
    } 
    public void report(string id) 
    { 
     idRep = id; 
    } 
    private void ReportForm_Load(object sender, EventArgs e) 
    { 

     ReportParameter[] param = new ReportParameter[2]; 
     param[0] = new ReportParameter("date1", dat1); 
     param[1] = new ReportParameter("date2", dat2); 
     this.reportViewer1.LocalReport.SetParameters(param); 

     if (idRep.Equals("extraMove")) 
     { 
      this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport, d1,d2); 
     } 
     else if (idRep.Equals("stripStuff")) 
     { 
      this.AGCT_StripStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_StripStuffReport, d1, d2); 
     } 
     else 
     { 
      MessageBox.Show("Ooops, something went wrong...!"); 
     } 

     this.reportViewer1.RefreshReport(); 
    } 
    } 
    } 

回答

5

OK,試圖弄明白,昨天我發現了一個解決方案,它是可以接受我,所以我想與分享其他:

1.st您需要創建屬性的類模型,所以它會在數據集中補充說: 例如:

namespace NavisReportLoader.App_Data 
{ 
    public class ExtraMoveModel 
    { 
     public string EventType { get; set; } 
     public int EventCount { get; set; } 
     public int Num20 { get; set; } 
     public int Num40 { get; set; } 
     public int Num45 { get; set; } 
     public int TEU { get; set; } 
     public float Cargo { get; set; } 
     public float Tare { get; set; } 
     public float Total { get; set; } 
    } 
} 

之後,你需要連接到數據庫中創建樸素簡單類,並調用存儲過程,傳遞的參數,並使用數據讀取器讀取輸出。在我的例子中,我添加到這個列表,並列舉我的模型:

例如:

public class ExtraMoveDataSet 
{ 
    string connectionString = @"Data Source=sampleDB; Initial Catalog=test; User Id=sa; Password=test"; 
    public IEnumerable<ExtraMoveModel> extraMove(DateTime dateFrom, DateTime dateTo) 
    { 
     var tempList = new List<ExtraMoveModel>(); 
     //string connectionString = @"Data Source=nsqltest; Initial Catalog=sparcsn4; User Id=sa; Password=lo02Nova"; 
     SqlConnection conn = new SqlConnection(connectionString); 
     SqlCommand cmd = new SqlCommand("AGCT_ServiceEventReport", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@dateFrom", dateFrom); 
     cmd.Parameters.AddWithValue("@dateTo", dateTo); 
     conn.Open(); 

     using (var dr = cmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       var temp = new ExtraMoveModel(); 
       temp.EventType = dr["event_type"].ToString(); 
       temp.EventCount = Convert.ToInt32(dr["CNT"]); 
       temp.Num20 = Convert.ToInt32(dr["NUM20"]); 
       temp.Num40 = Convert.ToInt32(dr["NUM40"]); 
       temp.Num45 = Convert.ToInt32(dr["NUM45"]); 
       temp.TEU = Convert.ToInt32(dr["TEU"]); 
       temp.Cargo = float.Parse(dr["Cargo"].ToString(),new CultureInfo("hr-HR")); 
       temp.Tare = float.Parse(dr["Tare"].ToString(),new CultureInfo("hr-HR")); 
       temp.Total = float.Parse(dr["Total"].ToString(),new CultureInfo("hr-HR")); 
       tempList.Add(temp); 
      } 
     } 
     conn.Close(); 
     return tempList; 
    } 
  • 步驟是創建數據集,將有相同的名稱屬性從一個模型。
  • enter image description here

  • 步驟創建在其上將結合數據集報表。
  • enter image description here

  • 終於可以將其添加到reportViewer1

    private void ReportForm_Load(object sender, EventArgs e) 
    { 
        ExtraMoveDataSet emDS = new ExtraMoveDataSet(); 
        if (idRep.Equals("extraMove")) 
        { 
         ReportParameter[] param = new ReportParameter[2]; 
         param[0] = new ReportParameter("date1", dat1); 
         param[1] = new ReportParameter("date2", dat2); 
         //string path = Directory.GetCurrentDirectory(); 
         //string replace = path.Replace("\\bin\\Debug", "") + "\\App_Data\\"+"ReportExtraMove.rdlc"; 
         var ret = emDS.extraMove(d1, d2); 
         ReportDataSource rds = new ReportDataSource("extraMove", ret.ToArray()); 
         this.reportViewer1.LocalReport.DataSources.Add(rds); 
         //this.reportViewer1.LocalReport.ReportPath = replace; 
         this.reportViewer1.LocalReport.ReportEmbeddedResource = "NavisReportLoader.App_Data.ReportExtraMove.rdlc"; 
         this.reportViewer1.LocalReport.SetParameters(param); 
         this.reportViewer1.RefreshReport(); 
        } 
    } 
    
  • 我希望這將有助於其他加快速度。

    乾杯!

    +0

    做得好的解釋有時候我覺得一些微軟技術不太常用 –

    0

    要強制Visual Studio自動創建綁定源,您必須先創建報告(.rdlc)。在數據源鏈接的情況下,當您添加組件(reportviewer)並將組件與報告名稱相關聯時,如圖所示,一旦您選擇了報告,它將自動創建一個綁定源,其中包含您在使用時使用的名稱創造了設計。

    0

    我花了一些時間在同一個問題。我使用的是VS 2013,其中數據集通過報表中的自動創建的BindingSource進行連接。如果您創建報告並添加所有必需元素,則一切正常。如果你(比如說)稍後添加一個表,那麼BindingSources會失步,或者不會創建。

    編輯報表設計視圖,單擊ReportViewer對象並使用頂部r.h中的小'任務'箭頭。角。選擇「重新綁定數據源」或「選擇數據源」以檢查它們是否正確綁定。

    相關問題