2012年12月6日木曜日

DataGridのセル内で改行

DataGridでセル内のテキストを編集中に、改行を含むテキストを入力したい場合があります。
Enterキー のみの場合はセルの編集を確定し、Shift + Enterキー で改行を入力できるようにします。

ここでは、DataGrid の列の自動生成を有効にするので、テキストを編集するセルのスタイルは、DataGridTextColumn の EditingElementStyle プロパティで指定できます。
このスタイルの KeyDown イベントに editingTextBox_KeyDown メソッドを登録しておきます。
editingTextBox_KeyDown メソッドは、押されたキーが Shift + Enterキーの場合は、テキストカーソルのところに改行を挿入します。


MainWindow.xaml

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="450">
    <Window.Resources>
        <Style TargetType="TextBox" x:Key="editingTextBoxStyle">
            <EventSetter Event="KeyDown" Handler="editingTextBox_KeyDown" />
        </Style>
    </Window.Resources>
    <DataGrid Grid.Row="1" Name="dataGrid"
              CanUserAddRows="False" CanUserDeleteRows="False"
              AutoGeneratingColumn="dataGrid_AutoGeneratingColumn"/>
</Window>

MainWindow.xaml.cs

using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace DataGridTest
{
    public partial class MainWindow Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable dt = new DataTable();
            dt.Columns.Add();
            dt.Columns.Add();
            dt.Columns.Add();
            dt.Rows.Add("走れメロス""太宰治""メロスは激怒した。");
            dt.Rows.Add("斜陽""太宰治""朝、食堂でスウプを一さじ、");
            this.dataGrid.ItemsSource = dt.DefaultView;
        }

        private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            ((DataGridTextColumn)e.Column).EditingElementStyle = (Style)this.Resources["editingTextBoxStyle"];
        }

        private void editingTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (Key.Return == e.Key && 0 < (ModifierKeys.Shift & e.KeyboardDevice.Modifiers))
            {
                TextBox tb = (TextBox)sender;
                int caret = tb.CaretIndex;
                tb.Text = tb.Text.Insert(caret, "\r\n");
                tb.CaretIndex = caret + 1;
                e.Handled = true;
            }
        }
    }
}

0 件のコメント:

コメントを投稿