2009-08-03 33 views
7

Tôi cần phải sắp đặt từng bước một thiết kế báo cáo. Đây là kịch bản:Làm thế nào tôi có thể tuần tự hóa thiết kế báo cáo DevExpress XtraReport

Ứng dụng có báo cáo cơ sở, giả sử "Báo cáo bán hàng" với một tập hợp các cột và thiết kế được xác định trước, như công ty. logo trong tiêu đề. Người dùng cần phải có khả năng thay đổi bố cục đó, ví dụ: chân trang có địa chỉ văn phòng hoặc số trang. Để làm điều đó, họ cần chỉnh sửa báo cáo, nhập nhà thiết kế và thêm/thay đổi những gì họ cần. Điều này thay đổi bố trí báo cáo cần phải được tuần tự hóa để được lưu trữ trong cơ sở dữ liệu cho người dùng đó, do đó, lần sau, người dùng sẽ mở báo cáo đó, bằng cách sử dụng thiết kế đó.

Làm cho tinh thần?

Trả lời

9

Dưới đây là một phiên bản đơn giản như thế nào tôi làm điều này:

XtraReport customReport; 
customReport = new MyXtraReport(); 
byte[] layout = LoadCustomLayoutFromDB(); 
if (layout != null) { 
    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(layout)) { 
     customReport.LoadLayout(memoryStream); 
    } 
} 

using (XRDesignFormEx designer = new XRDesignFormEx()) { 
    MySaveCommandHandler customCommands = new MySaveCommandHandler(designer.DesignPanel); 
    designer.DesignPanel.AddCommandHandler(customCommands); 
    designer.OpenReport(customReport); 
    designer.ShowDialog(this); 
    if (customCommands.ChangesSaved) 
     SaveCustomLayoutToDB(customCommands.Layout); 
} 

Bên MySaveCommandHandler lớp:

public virtual void HandleCommand(ReportCommand command, object[] args, ref bool handled) { 
    if (command != ReportCommand.SaveFileAs && command != ReportCommand.SaveFileAs) 
     return; 

    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) { 
     panel.Report.SaveLayout(memoryStream); 
     this.layout = memoryStream.ToArray(); 
     changesSaved = true; 
    } 

    panel.ReportState = ReportState.Saved; 
    handled = true; 
} 
+0

Tôi có một câu hỏi ... tại sao bạn lưu bố cục vào một byte [], nó đơn giản, trực tiếp hơn để lưu vào cơ sở dữ liệu? Vì vậy, trong phương thức SaveCustomLayoutToDb bạn chuyển nó tới một cột nhị phân của SQL Server hoặc một cái gì đó? – Sebastian

+0

@Sebastian: Có và có. –

+0

Cảm ơn bạn và Cảm ơn bạn. ;) – Sebastian

3

Tôi nghĩ rằng những gì bạn đang tìm kiếm là phương pháp SaveLayout:

Tiết kiệm báo cáo

YourReport report = new YourReport(); 

// Save the layout to a file. 
report.SaveLayout(@"C:\YourReport.repx"); 

tải báo cáo

YourReport report = new YourReport(); 

// Load the layout 
report.LoadLayout(@"C:\YourReport.repx"); 

Edit:

tại đây là link đến trang web hỗ trợ devexpress giải thích cách lưu định nghĩa báo cáo.

+0

Xin lỗi Francis, nhưng lưu báo cáo vào một tập tin repx không phải là, như xa như tôi biết, một tuần tự. Bạn có biết nếu công cụ có phương thức SaveToXml() hay gì đó không? Cảm ơn. – Sebastian

+0

Việc tuần tự hóa không có nghĩa là bạn phải lưu thông tin trong một tệp xml. Ngay bây giờ, DevExpress không hỗ trợ lưu định nghĩa báo cáo trong xml nhưng họ đã triển khai tính năng này cho một bản phát hành trong tương lai (http://www.devexpress.com/Support/Center/p/AS4336.aspx). –

+0

Đúng là Francis. Nó không có nghĩa là. Nhưng IMHO đó là cách phổ biến nhất để làm việc những ngày này. Để tuần tự hóa các đối tượng vào XML và gửi nó qua dây bằng các dịch vụ web hoặc lưu nó vào một tệp văn bản trong cơ sở dữ liệu. – Sebastian

1

Bạn có thể lưu/tải lên và từ một luồng bằng cách sử dụng ghi đè Lưu và LoadLayout. Đối với nhà thiết kế, bạn có thể thêm một trình xử lý lệnh để chặn lệnh lưu.

Những bài viết này nên bao gồm những gì bạn cần:

How to: Save and Restore a Report Definition from a Stream

How to: Override Commands in the End-User Designer (Custom Saving)

Và cho đầy đủ: List of all how-to's

Chỉnh sửa: liên kết cố định

+0

Cảm ơn rất nhiều Dag, đó là một dẫn rất tốt cho tôi để đi xa hơn trong vấn đề này. – Sebastian