2009-08-03 12 views
7

मुझे एक रिपोर्ट डिज़ाइन को क्रमबद्ध करने की आवश्यकता है। यह परिदृश्य है:मैं DevExpress XtraReport रिपोर्ट डिज़ाइन को क्रमबद्ध कैसे कर सकता हूं

ऐप की मूल रिपोर्ट है, चलिए प्री-डिफ़ाइंड कॉलम और डिज़ाइन के सेट के साथ कॉर्प की तरह "बिक्री रिपोर्ट" कहें। हेडर में लोगो। उपयोगकर्ताओं को उस लेआउट को जोड़ने की क्षमता की आवश्यकता होती है, उदाहरण के लिए, कार्यालय के पते के साथ एक पाद लेख, या पृष्ठ संख्या। ऐसा करने के लिए उन्हें रिपोर्ट संपादित करने की आवश्यकता है, डिजाइनर दर्ज करें और उन्हें जो भी चाहिए उसे जोड़ें/बदलें। इस बदले गए रिपोर्ट लेआउट को उस उपयोगकर्ता के डेटाबेस में संग्रहीत करने के लिए क्रमबद्ध करने की आवश्यकता है, इसलिए अगली बार, उपयोगकर्ता उस डिज़ाइन का उपयोग करके उस रिपोर्ट को खोलता है।

समझ में आता है?

उत्तर

9

यहाँ मैं कैसे का एक सरलीकृत संस्करण है ऐसा करें:

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); 
} 

अंदर MySaveCommandHandler वर्ग:

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

मेरे पास एक प्रश्न है ... आप लेआउट को बाइट में क्यों सहेजते हैं [], क्या यह डेटाबेस में सहेजने के लिए सरल, अधिक प्रत्यक्ष है? तो SaveCustomLayoutToDb विधि में आप इसे SQL सर्वर बाइनरी कॉलम या कुछ पास करते हैं? – Sebastian

+0

@ सेबेस्टियन: हाँ और हाँ। –

+0

धन्यवाद और धन्यवाद। ;) – Sebastian

3

मुझे लगता है कि आप देख रहे हैं SaveLayout विधि है:

रिपोर्ट

YourReport report = new YourReport(); 

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

रिपोर्ट

लोड हो रहा है सहेजा जा रहा है
YourReport report = new YourReport(); 

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

संपादित करें:

यहां link डेवएक्सप्रेस समर्थन साइट पर रिपोर्ट परिभाषा को सहेजने के तरीके को समझाते हुए।

+0

मुझे माफ करना फ्रांसिस, लेकिन एक repx फाइल करने के लिए रिपोर्ट की बचत नहीं, जहाँ तक मुझे पता है, एक क्रमबद्धता है। क्या आपको पता है कि उपकरण में SaveToXml() विधि या कुछ है? धन्यवाद। – Sebastian

+0

सीरियलाइजेशन का मतलब यह नहीं है कि आपको जानकारी को xml फ़ाइल में सहेजना है। अभी, DevExpress xml में रिपोर्ट परिभाषा को सहेजने का समर्थन नहीं करता है, लेकिन उन्होंने भविष्य में रिलीज (http://www.devexpress.com/Support/Center/p/AS4336.aspx) के लिए इस सुविधा को लागू किया है। –

+0

यह सच फ्रांसिस है। इसका मतलब यह नहीं है। लेकिन आईएमएचओ इन दिनों काम करने का सबसे आम तरीका है। ऑब्जेक्ट्स को एक्सएमएल में क्रमबद्ध करने और वेब सेवाओं का उपयोग करके तार के माध्यम से इसे भेजने या डेटाबेस में टेक्स्ट फ़ाइल में सहेजने के लिए। – Sebastian

1

आप सेव और लोडलायआउट ओवरराइड का उपयोग करके स्ट्रीम में से/लोड कर सकते हैं। डिज़ाइनर के लिए आप सेव कमांड को अवरुद्ध करने के लिए कमांड हैंडलर जोड़ सकते हैं।

ये लेख को कवर करना चाहिए कि तुम क्या जरूरत है:

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

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

और संपूर्णता के लिए: List of all how-to's

संपादित करें: तय लिंक

+0

धन्यवाद बहुत डैग, इस मामले में आगे बढ़ने के लिए यह एक बहुत अच्छा नेतृत्व है। – Sebastian