2012-05-18 9 views
12

मैं एक डब्ल्यूपीएफ डाटाग्रिड को कार्यान्वित कर रहा हूं जिसमें कई महत्वपूर्ण आंकड़ों वाली परियोजनाएं शामिल हैं। परियोजनाओं को परियोजना श्रेणियों द्वारा समूहीकृत किया जाता है।समूह उप-योग को कैसे संभालें और उदा। डब्ल्यूपीएफ डाटाग्रिड में लक्ष्य पंक्तियां?

प्रत्येक श्रेणी के लिए नहीं होनी चाहिए:

  1. एक पंक्ति उस स्तंभ के लिए सभी पंक्तियों में से प्रत्येक के महत्वपूर्ण व्यक्ति स्तंभ राशि में पता चलता है।
  2. एक लक्षित पंक्ति जो कि डेटासॉर ग्रिड का हिस्सा नहीं है। लक्ष्य पंक्ति प्रत्येक कॉलम के लिए बताती है कि वर्ष के लिए क्या लक्ष्य है (उदाहरण के लिए कितना पैसा खर्च करना है)।

ये पंक्तियां हमेशा प्रत्येक समूह (फ़िल्टरिंग सॉर्टिंग) में शीर्ष पर रहनी चाहिए।

मेरा पहला समाधान समूह डेटा हेडर में यह डेटा होना था। यह एक अच्छा समाधान नहीं है क्योंकि समूह शीर्षलेख स्तंभों का समर्थन नहीं करता है। यानी कॉलम चौड़ाई प्राप्त करके इसका निर्माण किया जाना चाहिए।

ऐसा किया जा सकता है लेकिन जब उपयोगकर्ता कॉलम को पुन: व्यवस्थित और छिपाना चाहते हैं तो यह जटिल हो जाता है।

डेटाग्रिड CollectionViewSource का उपयोग कर रहा है, इसलिए यह सी # कोड के साथ पॉप्युलेट नहीं है। मूल रूप से मैं इस उदाहरण का विस्तार कर रहा हूँ: http://msdn.microsoft.com/en-us/library/ff407126.aspx

धन्यवाद & बेस्ट सादर - मेटी

+0

क्या आपको इस ज़रूरतों का उत्तर देने के कोई उपाय मिले? यहां मेरा एसओ सवाल है (जिसे मैंने डुप्लिकेट के रूप में चिह्नित किया है): https://stackoverflow.com/questions/46206673/wpf-datagrid-grouping-and-totals – Simon

उत्तर

0

एक विकल्प और अन्य क्षेत्रों का नाम लिए विशेष मूल्यों के साथ डेटा स्रोत में पंक्तियों को समझ बनाने और उपयोग नहीं करते DataTrigger जोड़ने के लिए हो सकता है उन्हें विशेष रंगों और शायद कुछ अन्य के साथ दिखाने के लिए।

फ़िल्टरिंग सी # में किया जाता है, इसलिए यह इन पंक्तियों को प्रभावित नहीं करता है।

सॉर्टिंग यहां एकमात्र समस्या है। यह बताने के लिए इतना अच्छा होगा कि कुछ पंक्तियाँ क्रमशः 0 के साथ होती हैं और समूह में क्रम 1 के साथ होती हैं। लेकिन कारण मैं इसे कैसे करना है पता नहीं मैं कस्टम के बजाय सभी कॉलम के लिए सी # में छँटाई बस छंटाई की घोषणा कर होगा:

<CollectionViewSource.SortDescriptions> 
    <!-- Requires 'xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"' declaration. --> 
    <scm:SortDescription PropertyName="ProjectName"/> 
    <scm:SortDescription PropertyName="Complete" /> 
    <scm:SortDescription PropertyName="DueDate" /> 
</CollectionViewSource.SortDescriptions> 

संपादित करें: सब कुछ के शीर्ष पर यह एक बड़ी खामी मेरी 1 समाधान की तुलना में है (समूह शीर्षलेख में समतुल्य जानकारी) क्योंकि परिवर्तनों को फ़िल्टर करते समय मुझे केवल पंक्तियों के लिए गणना की जाने वाली रकम अपडेट करनी चाहिए।

तो यह उत्तर एक पूरा हैक है और सभी लालित्य का अभाव है और कि WPF के लिए :(

2

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

मेरा समाधान शामिल हैं 2 प्रमुख घटकों में से:
1. उप-योग पंक्तियां मुख्य डेटाग्रिड में पंक्तियां नहीं हैं, लेकिन अलग डेटाग्रिड्स हैं। मेरे पास प्रत्येक समूह में वास्तव में 2 अतिरिक्त ग्रिड हैं: 1 हेडर में जो केवल तभी प्रदर्शित होता है जब समूह ध्वस्त हो जाता है, और आइटम प्रस्तुति के नीचे एक होता है। उप-योग डेटाग्रिड्स के लिए आइटमसोर्स एक कनवर्टर से आता है जो समूह में आइटम लेता है और एक समग्र दृश्य मॉडल देता है।उप-योग ग्रिड के कॉलम मुख्य ग्रिड के समान हैं (डेटाग्रिड_लोडेड में भरे हुए हैं, हालांकि मुझे यकीन है कि यह xaml में भी किया जा सकता है)।

  <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander Background="Gray" HorizontalAlignment="Left" IsExpanded="True" 
               ScrollViewer.CanContentScroll="True"> 
             <Expander.Header> 
              <DataGrid Name="HeaderGrid" ItemsSource="{Binding Path=., Converter={StaticResource SumConverter}}" 
                 Loaded="DataGrid_Loaded" HeadersVisibility="Row" 
                 Margin="25 0 0 0" PreviewMouseDown="HeaderGrid_PreviewMouseDown"> 
               <DataGrid.Style> 
                <Style TargetType="DataGrid"> 
                 <Style.Triggers> 
                  <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}" 
                      Value="True"> 
                   <Setter Property="Visibility" Value="Collapsed"/> 
                  </DataTrigger> 
                 </Style.Triggers> 
                </Style> 
               </DataGrid.Style> 
              </DataGrid> 
             </Expander.Header> 
             <StackPanel> 
              <ItemsPresenter/> 
              <DataGrid Name="FooterGrid" ItemsSource="{Binding ElementName=HeaderGrid, Path=ItemsSource, Mode=OneWay}" 
                  Loaded="DataGrid_Loaded" HeadersVisibility="Row" 
                  Margin="50 0 0 0"> 
               <DataGrid.Style> 
                <Style TargetType="DataGrid"> 
                 <Style.Triggers> 
                  <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}" 
                     Value="False"> 
                   <Setter Property="Visibility" Value="Collapsed"/> 
                  </DataTrigger> 
                 </Style.Triggers> 
                </Style> 
              </DataGrid> 
             </StackPanel> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 


2. फिर इस मुद्दे को कैसे सब datagrids व्यवहार करने के लिए के रूप में यदि वे एक ही ग्रिड थे प्राप्त करने के लिए है। मैंने DataGridTextColumn (हमारे पास केवल इस मामले में टेक्स्ट है, लेकिन अन्य कॉलम प्रकारों को भी काम करना चाहिए) नामक कक्षा में DataGridSharedSizeTextColumn नामक कक्षा में जो ग्रिड क्लास के साझा आकार समूह व्यवहार की नकल करता है, को संभाला है। इसमें एक समूह नाम के साथ एक स्ट्रिंग निर्भरता संपत्ति है और एक ही समूह में सभी कॉलम का ट्रैक रखती है। जब Width.DesiredValue एक कॉलम में परिवर्तन होता है, तो मैं अन्य सभी कॉलम में मिनविड्थ अपडेट करता हूं और DataGridOwner.UpdateLayout() के साथ अद्यतन को मजबूर करता हूं। यह वर्ग कॉलम रीडरिंग को भी कवर कर रहा है और जब भी डिस्प्ले इंडेक्स बदलता है तो समूह-व्यापी अद्यतन करता है। मुझे लगता है कि यह विधि तब तक किसी अन्य कॉलम प्रॉपर्टी के साथ काम करेगी जब तक कि इसमें एक सेटर हो।

चयन, प्रतिलिपि आदि के साथ काम करने के लिए अन्य परेशान चीजें थीं लेकिन यह माउसइंटर और माउसलेव घटनाओं के साथ संभालने और कस्टम कॉपी कमांड का उपयोग करके बहुत आसान हो गया।

+0

मुझे खेद है कि आप उत्तर का जवाब नहीं दे रहे हैं। मुझे उम्मीद है कि यह अन्य लोगों की मदद करेगा। –

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