2013-05-09 5 views
6

ठीक है, मैंने इस समस्या के समाधान के लिए काफी लंबा समय खोजा है। मैं डब्ल्यूपीएफ डाटाग्रिड्स के लिए सरल प्रिंटिंग सिस्टम विकसित कर रहा हूं और डेटाटेबल का उपयोग करके वर्दी सेल प्लेसमेंट के साथ टेबल प्रिंट करने और इसे डेटाग्रिड के आइटमसोर्स के रूप में सेट करने में कामयाब रहा हूं।कुछ डेटाग्रिड कोशिकाओं को कई स्तंभों का विस्तार करें

हालांकि, मैं जरूरत को कुछ पंक्तियों केवल एक सेल (आप की तरह "पंक्ति समूह शीर्ष लेख" तालिका के अंदर यह सोच सकते हैं) होते हैं।

इसलिए, चूंकि मुझे डेटा कॉल करने योग्य कोशिकाओं के बारे में कुछ भी नहीं मिला है, जो कई कॉलम फैलाते हैं (यदि यह बनाया जा सकता है, तो यह जानना एक बड़ी बात होगी), मुझे लगा कि मुझे मैन्युअल रूप से डेटाग्रिड में पंक्तियां जोड़नी होंगी, और इस तरह यह कुछ हल:

  • वांछित कॉलम के साथ नए डेटा ग्रिड बनाने
  • पंक्तियों एक के बाद एक जोड़े, DataGridCellPanel कि पंक्तियों के माध्यम से फैली है या नहीं फैला स्थापित करने

दूसरी बात मैं कहाँ है है समस्या (यदि यह सही है, वह है)। मुझे को को डेटाग्रिड में जोड़ने की आवश्यकता है जो सेल डेटा (सरणी में इंडेक्स को सेल इंडेक्स को मच करना चाहिए) के रूप में तारों की सरल सरणी का उपयोग करता है। क्या ऐसा कुछ करने का कोई आसान तरीका है?

+0

यहां मैंने इसे पूरी तरह से एक्सएएमएल में कैसे किया: http://stackoverflow.com/a/38687666/3360864 – Erik

उत्तर

4

तो इस सब के साथ कुछ और झुकाव के बाद, मैं एक बहुत अच्छा समाधान तक पहुंच गया हूं।

डेटाग्रिड लोड होने के बाद विशेष पंक्तियों में डेटा टेम्पलेट लागू करना सबसे अच्छा और आसान काम है। इसलिए, मैं डेटाटेबल्स के साथ मूल विचार पर अटक गया और उन इंडेक्स को याद किया जिन्हें उनके टेम्पलेट को बदलने की आवश्यकता थी। मैंने अभी इन इंडेक्स से DataGridRows लिया है और उस टेम्पलेट को लागू किया है जिसने कस्टम बनाया था आइटमपेनल टेम्पलेट जो एकाधिक कॉलम फैलाता है।

संपादित करें: डैनियल के अनुरोध पर, मुझे कुछ कोड शामिल है।

<ControlTemplate TargetType='{x:Type DataGridRow}' 
      xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
      xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
      > 
      <Border> 
       <DataGridCellsPresenter Foreground='Black'> 
        <DataGridCellsPresenter.ItemsPanel> 
         <ItemsPanelTemplate> 
          <local:DataGridSpannedCellPanel /> 
         </ItemsPanelTemplate> 
        </DataGridCellsPresenter.ItemsPanel> 
       </DataGridCellsPresenter> 
      </Border> 
     </ControlTemplate> 

नोट:: स्थानीय:

पहली बात हम की जरूरत फैले पंक्ति के लिए एक टेम्पलेट है DataGridSpannedCellPanel ओवरराइड ArrangeOverride विधि है कि पहले सेल अवधि पूरे आकार में आता है के साथ एक कस्टम DataGridCellsPanel है।

उदाहरण के लिए आप कोड-पीछे में एक स्ट्रिंग बना सकते हैं और अपना टेम्पलेट लोड कर सकते हैं। अगली बात अपने ग्रिड बनाने और इस नए टेम्पलेट के साथ पंक्तियों के कुछ आरंभ कर रहा है:

var newGrid = MakeNewDataGrid(); 
newGrid.ItemsSource = myTable.AsDataView(); 
var template = XamlReader.Parse(HeaderRowTemplate) as ControlTemplate; 

foreach (int index in myHeaderIndices) 
        { 
         var container = newGrid.ItemContainerGenerator.ContainerFromIndex(index); 
         var row = container as DataGridRow; 
         if (row != null) 
         { 
          row.Template = template; 
         } 
        } 

यह भी ध्यान रखें, अपने तालिका में पंक्तियों के रूप में निम्नानुसार किए जाने के लिए की जरूरत है:

if (bindableQuote.IsGroup()) 
         { 

          table.Rows.Add("Header"); 
         } 
         else table.Rows.Add(rowData.ToArray()); 

इसके बारे में वह , DataGridSpannedCellPanel को कार्यान्वित करने का तरीका जानने के लिए केवल एक ही चीज़ शेष है।

+0

क्या आप इसके लिए एक संक्षिप्त उदाहरण प्रदान कर सकते हैं? –

+0

कृपया संपादित प्रतिक्रिया देखें। आपके पास होने वाले किसी भी प्रश्न का उत्तर देने में मुझे खुशी होगी। –

+0

@DejanMaksimovic: क्या आपने डेटाग्रिडस्पैनसेलपेलेल को कार्यान्वित करने का तरीका बताया है? यदि हाँ आप कोड या महत्वपूर्ण भागों को पोस्ट कर सकते हैं? धन्यवाद। –

संबंधित मुद्दे