FlexGrid for WPF
セル編集時の改行を許可する
基本操作 > 編集機能 > セル編集時の改行を許可する

デフォルトではセル編集時に [Alt]+[Enter]、または [Ctrl]+[Enter]、または [Shift]+[Enter][Ctrl]+[J][Ctrl]+[Shift]+[J])で、テキストを改行することができます。この動作を制御する必要がある場合は、下記のように、CellFactory クラスをオーバーライドしたカスタムセルファクトリを使用してセル上の動作をカスタマイズできます。

コードのコピー
Public Sub New()
    InitializeComponent()
    C1FlexGrid.ItemsSource = Product.GetProducts(10)
    ' カスタムセルファクトリを作成します
    C1FlexGrid.CellFactory = New CustomerCellFactory()
End Sub
Public Class CustomerCellFactory
    Inherits CellFactory
    Public Overrides Function CreateCellEditor(grid As C1FlexGrid, cellType As CellType, rng As CellRange) As FrameworkElement
        Dim control = MyBase.CreateCellEditor(grid, cellType, rng)
        Dim bdr = TryCast(control, Border)
        Dim tb = TryCast(bdr.Child, TextBox)
        AddHandler tb.PreviewKeyUp, AddressOf tb_PreviewKeyUp
        Return control
    End Function
    Private Sub tb_PreviewKeyUp(sender As Object, e As KeyEventArgs)
        '左側の[Ctrl]+[Enter]キーを押下すると、改行を許可します
        If e.Key = Key.Enter AndAlso Keyboard.IsKeyDown(Key.LeftCtrl) Then
            Dim tb = TryCast(sender, TextBox)
            tb.TextWrapping = TextWrapping.Wrap
            If tb IsNot Nothing Then
                Dim linebreak As String = vbCr & vbLf
                Dim start = tb.SelectionStart
                Dim text1 = tb.Text.Substring(0, tb.SelectionStart)
                Dim text2 = tb.Text.Substring(tb.SelectionStart)
                Dim sb As New StringBuilder()
                Dim newText = sb.Append(text1).Append(linebreak).Append(text2).ToString()
                start = start + linebreak.Length
                tb.Text = newText
                tb.SelectionStart = start
            End If
            e.Handled = True
        End If
    End Sub
End Class
コードのコピー
public MultilineEditor()
{
    InitializeComponent();           
    C1FlexGrid.ItemsSource = Product.GetProducts(10);
    // カスタムセルファクトリを作成します
    C1FlexGrid.CellFactory = new CustomerCellFactory();
}

public class CustomerCellFactory : CellFactory
{
    public override FrameworkElement CreateCellEditor(C1FlexGrid grid, CellType cellType, CellRange rng)
    {
        var control = base.CreateCellEditor(grid, cellType, rng);
        var bdr = control as Border;
        var tb = bdr.Child as TextBox;
        tb.PreviewKeyUp += tb_PreviewKeyUp;
        return control;
    }
    void tb_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        //左側の[Ctrl]+[Enter]キーを押下すると、改行を許可します
        if (e.Key == Key.Enter && Keyboard.IsKeyDown(Key.LeftCtrl))
        {
            var tb = sender as TextBox;
            tb.TextWrapping = TextWrapping.Wrap;
            if (tb != null)
            {
                string linebreak = "\r\n";
                var start = tb.SelectionStart;
                var text1 = tb.Text.Substring(0, tb.SelectionStart);
                var text2 = tb.Text.Substring(tb.SelectionStart);
                StringBuilder sb = new StringBuilder();
                var newText = sb.Append(text1).Append(linebreak).Append(text2).ToString();
                start = start + linebreak.Length;
                tb.Text = newText;
                tb.SelectionStart = start;
            }
            e.Handled = true;
        } 
    }
}