2011-07-01 5 views
1

をレンダリング**アップデートは以下は、パフォーマンス(カスタムグリッドコントロール)

に疑問を見てください私は私のWPFアプリケーションでデータグリッドを使用しようとしていますが、私は耐えられないように、性能を見つけています。

私は、100行15列のデータセットと、あらゆる種類のスクロールまたは列幅リサイズペイントを非常にゆっくりとバインドしています。

セル境界線がオンになっているときに古いwinforms datagridviewのパフォーマンスが低下したが、そのwpfカウンターパートでグリッド線をオフにしても効果はありません。

グリッドを持つウィンドウ:

<Window x:Class="GridPerformanceTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" EnableColumnVirtualization="True" EnableRowVirtualization="True" 
       VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="{x:Null}" 
       BorderBrush="{x:Null}" IsSynchronizedWithCurrentItem="False" BorderThickness="0" RowHeight="15" 
       GridLinesVisibility="None" HorizontalGridLinesBrush="{x:Null}" VerticalGridLinesBrush="{x:Null}" ColumnHeaderHeight="15"/> 
</Grid> 

私は自分のデータを移入しています方法:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataSource source = new DataSource(); 

     DataSet ds = new DataSet(); 
     ds.Tables.Add(source.Execute("select * from tbl_users")); 

     this.DataContext = ds.Tables[0]; 
    } 
} 

編集:私は運を持っていないので、だから、

私が今探しているものよりも多くの機能を持っていると確信しています。テキストとコピー/貼り付けのためのデータを選択する)私は自分で試して作業することに決めました。

これはカスタムユーザーコントロールでの最初のショットですが、パフォーマンスの悪いソース、つまりグリッドが見つかりました。

私の行データを含む列とスタックパネルにグリッドスプリッタを使用してコントロールを書き込むと、その行をスクロールすることは完全ではありません - 私は良い「ol winforms」データグリッドに慣れていました。

グリッド制御コード:

public partial class CustomGridControl : UserControl 
{ 
    public CustomGridControl() 
    { 
     InitializeComponent(); 

     for (int i = 0; i < 20; i++) 
     { 
      ColumnDefinition col = new ColumnDefinition(); 
      col.Width = new GridLength(75); 
      _rootGrid.ColumnDefinitions.Add(col); 

      StackPanel pnl = new StackPanel(); 
      pnl.Orientation = Orientation.Vertical; 

      for (int x = 0; x < 1000; x++) 
      { 
       TextBlock blk = new TextBlock(); 
       blk.Foreground = Brushes.Black; 
       blk.Text = "Row: " + x.ToString() + " Col: " + i.ToString(); 

       pnl.Children.Add(blk); 
      } 

      Grid.SetColumn(pnl, i); 
      _rootGrid.Children.Add(pnl); 

      GridSplitter splitter = new GridSplitter(); 
      splitter.Width = 2; 
      splitter.BorderBrush = Brushes.Black; 

      Grid.SetColumn(splitter, i); 
      Grid.SetRowSpan(splitter, 1000); 

      _rootGrid.Children.Add(splitter); 

     } 
    } 

とXAML:

<UserControl x:Class="CustomGrid.CustomGridControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<Grid > 
    <ScrollViewer> 
     <Grid x:Name="_rootGrid" Background="Aqua"/> 
    </ScrollViewer> 
</Grid> 

私がしようとするとスプリッターのいずれかをドラッグすると、パフォーマンスがちょうど標準と同じように、恐ろしいですWPFデータグリッド。

パフォーマンスを最適化するために仮想化を行っていないことは知っていますが、スタックパネルを使用した場合のパフォーマンスはまだ100倍優れています。

私の質問を更新する - 他のタイプのパネルの列を処理する方法について知っていれば、その列に対して同じグリッドスプリッタタイプの機能を使用できるようになります。

カスタムパネル/グリッドへのリンクがあれば、それなりの価値があります。

+1

あなたの質問がありますか? Microsoft DataGridをスピードアップする方法はありません。あなたは良い選択肢が何かを尋ねていますか? –

+0

さて、データグリッドのスピードアップを望んでいましたが、実際には:p何が良い選択でしょうか?私はgridviewを使用しようとしているとパフォーマンスはわずかに良いです - 私は何かまたはいくつかの設定が間違っていると感じるこれらのコントロールは、実際には使用できないので、良いのolagformsからのdatagridviewと比較します。 – ChandlerPelhams

+0

Microsoft DataGridをスピードアップする方法がわかりません。エクシードのほうがはるかに高速で、他のいくつかの企業もそうです。データを書き込む必要がない場合、ListView/GridViewは非常に高速(10〜20回)です。 –

答えて

1

VirtualizingStackPanel.*プロパティの代わりに、 'EnableRowVirtualization'と 'EnableColumnVirtualization'を設定することで、hereのようにパフォーマンスを少し向上させることができます。

固定列幅を設定することでも改善できます。

関連する問題