2012-01-06 17 views
13

मैं सोच रहा था कि .NET 4.0 में एक WPF डेटाग्रिड में, क्या यह एक स्थिर पंक्ति होना संभव है।फ्रीज डेटाग्रिड पंक्ति

जो मैं प्राप्त करने की कोशिश कर रहा हूं वह एक स्थिर पंक्ति (पंक्ति 0) बनाने के लिए है, जो डेटा ग्रिड को स्क्रॉल होने पर हमेशा शीर्ष पर प्रदर्शित किया जाएगा।

विचार यह है कि उस पंक्ति 0 को हमेशा देखा जाएगा क्योंकि उपयोगकर्ता डेटाग्रिड के माध्यम से स्क्रॉल करता है।

धन्यवाद।

+0

आपका मतलब कॉलम है? या आप कॉलम और पंक्ति 0 मतलब है? – RvdK

+1

छुपा स्क्रॉलबार के साथ स्क्रॉलव्यू में ग्रिड व्यूहेडररॉव प्रस्तुतकर्ता को रखें। स्क्रॉलबार सक्षम दोनों के साथ आइटम्स प्रेजेंटर को दूसरे स्क्रॉल व्यू में रखें। – Dotnet

+0

नहीं मेरा मतलब पंक्ति है।जब आप डेटाग्रिड को स्क्रॉल करते हैं तो आप पंक्ति 0 का दृश्य खो देंगे। लेकिन मैं हमेशा पंक्ति 0 को देखना चाहता हूं। इसलिए जब आप पंक्ति 360 पंक्ति 0 कहने के लिए स्क्रॉल करते हैं तो भी शीर्षलेख की तरह दिखाई देगा। उम्मीद है कि समझ में आता है। – user101010101

उत्तर

0

मुझे पंक्तियों के बारे में निश्चित नहीं है लेकिन आप FrozenColumnCount का उपयोग करके कॉलम जमा कर सकते हैं। इस तरह यह हमेशा दिखाई देगा। एक फ्रीज संपत्ति होनी चाहिए।

+3

और फिर RotateTransform का उपयोग करें :) –

+2

कोई अन्य तरीका नहीं है? अजीब लगता है यह नहीं किया जा सकता है। – user101010101

+0

मुझे जो पता है वह नहीं – Sulby

6

यह "सरल समाधान" केवल एक फ्रीजबल पाद लेख के लिए है, जमे हुए हेडर समाधान थोड़ा अलग होगा (और वास्तव में बहुत आसान होगा - केवल हेडर टीमप्लेट के साथ खेलें - एक स्टैक पैनल डालें, जितनी चाहें उतनी चीजें स्टैक्ड हो जाएं)।

इसलिए मुझे एक फूटर पंक्ति की आवश्यकता है जो फ्रीज करने योग्य है, मुझे महीनों के लिए कुछ भी नहीं मिला, इसलिए अंततः मैंने आलसी होने और जांच करने का फैसला किया।

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

योजना:

पहले, डेटा ग्रिड टेम्पलेट निकालने (मैं मिश्रण का इस्तेमाल किया)।

PART_ColumnHeadersPresenter 
PART_ScrollContentPresenter 
PART_VerticalScrollBar 

सही PART_VerticalScrollBar के तहत, वहाँ एक ग्रिड है (मैं इसे स्पष्टता के लिए यहाँ पोस्ट करेंगे)

<Grid Grid.Column="1" Grid.Row="2"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/> 
</Grid> 

ग्रिड मैं संशोधित है यही कारण है कि: टेम्पलेट से परिचित हो रही है, क्रम में भागों ध्यान दें एक "फ्रीजबल/पाद लेख पंक्ति" शामिल करने के लिए। मैं सिर्फ कड़ी मेहनत से कोड रंग करने के लिए जा रहा हूँ, और सादगी के लिए hoperfully उपयोगी "नाटक" गुणों के साथ बाइंडिंग की जगह (मैं उन्हें चिह्नित कर देंगे "MyViewModel.SomeProperty ताकि वे देख करने के लिए आसान कर रहे हैं):

<Grid Grid.Column="1" Grid.Row="2" x:Name="PART_DataGridColumnsVisualSpace"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <ScrollBar Grid.Column="2" Grid.Row="3" Name="PART_HorizontalScrollBar" Orientation="Horizontal" 
      Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" 
      Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
      Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 

    <Border x:Name="PART_FooterRowHeader" Grid.Row="1" Height="30" Background="Gray" BorderBrush="Black" BorderThickness="0.5"> 
    <TextBlock Margin="4,0,0,0" VerticalAlignment="Center">MY FOOTER</TextBlock> 
    </Border> 
    <ItemsControl x:Name="PART_Footer" ItemsSource="{Binding MyViewModel.FooterRow}" 
       Grid.Row="1" Grid.Column="1" Height="30"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Border Background="Gray" BorderThickness="0,0,0.5,0.5" BorderBrush="Black"> 
        <!-- sticking a textblock as example, i have a much more complex control here--> 
        <TextBlock Text="{Binding FooterItemValue}"/> 
       </Border> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.Template> 
      <ControlTemplate> 
       <ScrollViewer x:Name="PART_Footer_ScrollViewer" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" 
          CanContentScroll="True" Focusable="false"> 
        <StackPanel IsItemsHost="True" Orientation="Horizontal"/> 
       </ScrollViewer> 
      </ControlTemplate> 
     </ItemsControl.Template> 
    </ItemsControl> 
</Grid> 

इसके अलावा करने के लिए जोड़ स्क्रॉल करने के लिए डेटा ग्रिड प्रतिक्रिया और हैडर आकार बदलने

<DataGrid ... ScrollViewer.ScrollChanged="OnDatagridScrollChanged" 

<Style TargetType="DataGridColumnHeader"> 
    <EventSetter Event="SizeChanged" Handler="OnDataColumnSizeChanged"/> 
</Style> 

अब, वापस .xaml.cs

मूल रूप से दो मुख्य बातों की जरूरत है में:

(1) सिंक स्तंभ आवासीय Ze (ताकि इसी पाद लेख सेल का आकार बदलता है) (2) पाद लेख स्क्रॉल

//syncs the footer with column header resize 
private void OnDatagridScrollChanged(object sender, ScrollChangedEventArgs e) 
{ 
    if (e.HorizontalChange == 0.0) return; 
    FooterScrollViewer.ScrollToHorizontalOffset(e.HorizontalOffset); 
} 

//syncs scroll 
private void OnDataColumnSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    //I don't know how many of these checks you need, skip if need to the gist 
    if (!_isMouseDown) return; 
    if (!_dataGridLoaded) return; 
    if (!IsVisible) return; 

    var header = (DataGridColumnHeader)sender; 
    var index = header.DisplayIndex - ViewModel.NumberOfHeaderColumns; 

    if (index < 0 || index >= FooterCells.Count) return; 

    FooterCells[index].Width = e.NewSize.Width; 
} 

//below referencing supporting properties: 
private ScrollViewer _footerScroll; 
private ScrollViewer FooterScrollViewer 
{ 
    get { 
     return _footerScroll ?? 
       (_footerScroll = myDataGrid.FindVisualChildByName<ScrollViewer>("PART_Footer_ScrollViewer")); 
     } 
} 

//added this so I don't have to hunt them down from XAML every time 
private List<Border> _footerCells; 
private List<Border> FooterCells 
{ 
    get 
    { 
     if (_footerCells == null) 
     { 
      var ic = myDataGrid.FindVisualChildByName<ItemsControl>("PART_Footer"); 
      _footerCells = new List<Border>(); 
      for (var i = 0; i < ic.Items.Count; i++) 
      { 
       var container = ic.ItemContainerGenerator.ContainerFromIndex(i);        
       var border = ((Visual)container).FindVisualChild<Border>(); 
       _footerCells.Add(border); 
      } 
     } 
     return _footerCells; 
    } 
} 

यह है कि के साथ सिंक डेटा ग्रिड स्क्रॉल! मुझे लगता है कि सबसे महत्वपूर्ण हिस्सा एक्सएएमएल है यह देखने के लिए कि आप अपनी "फ्रीजबल पंक्ति" कहां रख सकते हैं, बाकी सब कुछ, जैसे चीजों को जोड़ना/सिंक करना बहुत आसान है - लगभग एक लाइनर)

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