none
DataGridTemplateColumn内のTextBoxのフォーカスについて RRS feed

  • 質問

  • お世話になります。

    DataGridでDataGridTemplateColumnを定義し、その中でTextBoxを使っています。

    <DataGridTemplateColumn Header="名前" Width="*">
    	<DataGridTemplateColumn.CellTemplate>
    		<DataTemplate>
    			<TextBox Name="tbName" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" TextChanged="tbName_TextChanged"/>
    		</DataTemplate>
    	</DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    

    実行して動作を確認すると、タブでセル移動したときセルが選択されたあとにその中のTextBoxが選択されてしまいます。

    タブを2回押さないと中のTextBoxが選択されないんですが、セルが選択されると同時にTextBoxを選択させることはできますか?

    2012年3月9日 6:35

回答

  • 次の2段階を踏む必要があります。

    1.DataGridを編集モードにする。
    2.TextBoxにフォーカスを移す。

    1.の「DataGridを編集モードにする」は、以下のコードで実現できます。DataGridのCurrentCellChangedイベントを利用しています。また、DataGridHelperクラスは、以下のページに掲載されているコードを利用させていただきました。

    WPF DataGrid Current Row Index
    http://social.msdn.microsoft.com/Forums/en/wpf/thread/0cdf2968-00e8-4ea5-aea0-ffd0e8230110

    private void tESTDataGrid_CurrentCellChanged(object sender, EventArgs e)
    {
        var cell = DataGridHelper.GetCell((DataGridCellInfo)tESTDataGrid.CurrentCell);
        //if (cell.Column.Header.ToString() == "TEST2")
        //{
            cell.Focus();
            tESTDataGrid.BeginEdit();
        //}
    }

    TextBoxへフォーカスを移すことについては、FocusManagerを利用して、以下のようにXAMLで行っています。

    <DataGridTemplateColumn Header="TEST2" Width="50"  KeyboardNavigation.IsTabStop="False">
        
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox Name="tbName" Text="{Binding TEST2, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <Grid  FocusManager.FocusedElement="{Binding ElementName= tbName}">
                    <TextBox Name="tbName" Text="{Binding TEST2, UpdateSourceTrigger=PropertyChanged}" />
                </Grid>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
        
    </DataGridTemplateColumn>

    最終的な目標がわかりませんが、TABキーで移動しただけでDataGridが編集モードに入り、すぐに入力できるのであれば、わざわざTextBoxを配置する必要はないかもしれませんね。

    --------------------------------------------------------------------------------

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


     

    2012年3月12日 4:10
    モデレータ

すべての返信

  • 次の2段階を踏む必要があります。

    1.DataGridを編集モードにする。
    2.TextBoxにフォーカスを移す。

    1.の「DataGridを編集モードにする」は、以下のコードで実現できます。DataGridのCurrentCellChangedイベントを利用しています。また、DataGridHelperクラスは、以下のページに掲載されているコードを利用させていただきました。

    WPF DataGrid Current Row Index
    http://social.msdn.microsoft.com/Forums/en/wpf/thread/0cdf2968-00e8-4ea5-aea0-ffd0e8230110

    private void tESTDataGrid_CurrentCellChanged(object sender, EventArgs e)
    {
        var cell = DataGridHelper.GetCell((DataGridCellInfo)tESTDataGrid.CurrentCell);
        //if (cell.Column.Header.ToString() == "TEST2")
        //{
            cell.Focus();
            tESTDataGrid.BeginEdit();
        //}
    }

    TextBoxへフォーカスを移すことについては、FocusManagerを利用して、以下のようにXAMLで行っています。

    <DataGridTemplateColumn Header="TEST2" Width="50"  KeyboardNavigation.IsTabStop="False">
        
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox Name="tbName" Text="{Binding TEST2, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <Grid  FocusManager.FocusedElement="{Binding ElementName= tbName}">
                    <TextBox Name="tbName" Text="{Binding TEST2, UpdateSourceTrigger=PropertyChanged}" />
                </Grid>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
        
    </DataGridTemplateColumn>

    最終的な目標がわかりませんが、TABキーで移動しただけでDataGridが編集モードに入り、すぐに入力できるのであれば、わざわざTextBoxを配置する必要はないかもしれませんね。

    --------------------------------------------------------------------------------

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


     

    2012年3月12日 4:10
    モデレータ
  • trapemiyaさん、回答ありがとうございます。

    回答していただいた内容を参考にすると問題なくできました。

    ありがとうございました。

    最終的な目標がわかりませんが、TABキーで移動しただけでDataGridが編集モードに入り、すぐに入力できるのであれば、わざわざTextBoxを配置する必要はないかもしれませんね。

    たしかにその通りです。

    他のDataGridTemplateColumnで複数のコントロールを配置したため、それに合わせてTextBoxが1つでもDataGridTemplateColumnを使っていました。

    2012年3月13日 8:31