Tag: WPF/DataGrid/Tips

目次

参考情報

Tips

ヘッダークリックでソートする

DataGridRow、DataGridCellを検索する

列を動的に生成する

シングルクリックで編集する

基本

  • Windows Presentation Foundation (WPF) - Single-Click Editingにある方法で可能。
  • DataGridCellにPreviewMouseLeftButtonDownをセットし、事前にセルにフォーカスをあわせ選択状態にすることでシングルクリックで編集可能になる。
  • Application全体でDataGridに共通のスタイルを設定している場合、EventSetterで設定するとスタイルが適用されなくなってしまうので、ResourceDictionaryを使って設定する(下記参照)

すべてのDataGridでシングルクリック編集を可能にする

  • c# - Single click edit in WPF DataGrid - Stack Overflowに記述あり。
  • ResourceDictionaryを使う。新規→リソースディクショナリでDataGrydStyles.xamlを追加。
    <ResourceDictionary 
        x:Class="ControlDemo.DataGridDemo.SingleClick.DataGridStyles"
        x:ClassModifier="public"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Style TargetType="DataGrid">
            <!-- Your DataGrid style definition goes here -->
            <Setter Property="CellStyle">
                <Setter.Value>
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"/>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    
  • DataGridStyles.xaml.csを追加し、ここにDataGridCell_PreviewMouseLeftButtonDownを追加する。
    namespace ControlDemo.DataGridDemo.SingleClick
    {
        partial class DataGridStyles : ResourceDictionary
        {
            //
            // SINGLE CLICK EDITING
            //
            private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                DataGridCell cell = sender as DataGridCell;
                if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
                {
                    if (!cell.IsFocused)
                    {
                        cell.Focus();
                    }
                    DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                    if (dataGrid != null)
                    {
                        if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                        {
                            if (!cell.IsSelected)
                                cell.IsSelected = true;
                        }
                        else
                        {
                            DataGridRow row = FindVisualParent<DataGridRow>(cell);
                            if (row != null && !row.IsSelected)
                            {
                                row.IsSelected = true;
                            }
                        }
                    }
                }
            }
    
            static T FindVisualParent<T>(UIElement element) where T : UIElement
            {
                UIElement parent = element;
                while (parent != null)
                {
                    T correctlyTyped = parent as T;
                    if (correctlyTyped != null)
                    {
                        return correctlyTyped;
                    }
    
                    parent = VisualTreeHelper.GetParent(parent) as UIElement;
                }
                return null;
            } 
        }
    }
    
    

DataGridTemplateColumnで内部のコントロールにフォーカスするようにする

  • DataGridTextColumnなどでは上記シングルクリック対応により一発でセルが編集可能になるが、DataGridTemplateColumnでは編集状態になるものの、内部のコントロールにフォーカスしないため、もう一回クリックする必要がでてくる。
  • これを解消するには、DataGridTemplateColumnを継承したクラスを使う。
        public class CustomDataGridTemplateColumn :DataGridTemplateColumn
        {
            protected override object PrepareCellForEdit(FrameworkElement editingElement,
                                                                    RoutedEventArgs editingEventArgs)
            {
                editingElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
                return base.PrepareCellForEdit(editingElement, editingEventArgs);
            } 
        }
    
  • xamlでDataGridTemplateColumn→CustomDataGridTemplateColumnに変更する。

行をDrag and Dropで入れ替える。セルベースで選択する

三つの状態をもったソート


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:45