2017-03-12 11 views
0

私はWPFアプリケーションで奇妙な問題があります。ユーザーは、少なくとも1行の請求書をDataGridに入力することになっています。 1つのフィールドには金額が含まれているので、i,ffのようになります。つまり、少なくとも1桁の数字とカンマ(ヨーロッパにある)と2桁の小数点のある整数部分です。WPFフォームで金額を編集する

ユーザーがフィールドにピントを合わせると、積分部分を上書きすることができ、コンマは固定され、小数部分も上書きすることができます。したがって、ユーザーは積分部分を入力してから、カーソルを右に移動してカンマをスキップし、量の小数部分を入力する必要があります。

この動作は、会計士であり、一度にすべての金額を入力するために使用されたため、ユーザーから批判されています。だから私の質問です:フィールド全体を上書き可能にする方法はありますか?ここで

は、DataGrid列のためのXAMLです:

<DataGridTextColumn x:Name="colBetBtto" 
    Header="Brutto" 
    HeaderStyle="{StaticResource DataGridHeaderRightAligned}" 
    Width="*" 
    CellStyle="{StaticResource DataGridCellRightAligned}" 
    Binding="{Binding Path=BttoBetrag, Mode=TwoWay, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}"> 
</DataGridTextColumn> 

セルスタイルは次のとおりです。

<Style x:Key="DataGridCellRightAligned" TargetType="DataGridCell"> 
    <Setter Property="HorizontalContentAlignment" Value="Center" /> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="TextBlock.TextAlignment" Value="Right" /> 
    <Setter Property="Padding" Value="0,0,1,0" /> 
</Style> 

任意のアイデアは、その行動を引き起こすもの?

答えて

1

あなたはDataGridTemplateColumnDataGridTextColumnを交換し、StringFormatは読み取り専用TextBlockに適用できる:

<DataGridTemplateColumn Header="Brutto" CellStyle="{StaticResource DataGridCellRightAligned}" Width="*"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding BttoBetrag, StringFormat=N2}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding BttoBetrag}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

そして、編集可能なTextBoxの値は、特定のフォーマットせずに提示されるべきです。

編集:カンマを編集中に消えていますが、ユーザーが値を編集するためにセルを二回クリックする必要がありますされるように

あなたの提案ソリューションが動作します。私が必要とするのは、タブシーケンスやシングルクリックでセル全体の値が選択され、変更できることです。

これは新しい質問/問題ですか?

とにかく、あなたはDataGridためGotFocusイベントを処理できます。

private void dataGrid_GotFocus(object sender, RoutedEventArgs e) 
{ 
    if (e.OriginalSource.GetType() == typeof(DataGridCell)) 
    { 
     DataGrid dataGrid = sender as DataGrid; 
     dataGrid.BeginEdit(e); 
    } 
} 

編集2:

私は期待してい何がタブに、ユーザーであるか、列フィールドにクリックしてください。次に、全体の内容が強調表示され、ユーザーは数字、カンマ、および前の内容を上書きする数字を入力することができます。そして、このようなイベントを処理する

試してみてください。

private void dataGrid_GotFocus(object sender, RoutedEventArgs e) 
{ 
    DataGridCell cell = e.OriginalSource as DataGridCell; 
    if (cell != null) 
    { 
     DataGrid dataGrid = sender as DataGrid; 
     dataGrid.BeginEdit(e); 

     cell.Dispatcher.BeginInvoke(new Action(() => 
     { 
      ContentPresenter cp = cell.Content as ContentPresenter; 
      if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0) 
      { 
       TextBox textBox = VisualTreeHelper.GetChild(cp, 0) as TextBox; 
       if (textBox != null) 
       { 
        Keyboard.Focus(textBox); 
        textBox.SelectAll(); 
       } 
      } 
     }), System.Windows.Threading.DispatcherPriority.Background); 
    } 
} 

あなたはまたTextBoxStringFormatを適用することもできます。

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding BttoBetrag, StringFormat=N2}" /> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 
+0

MM8あなたの助けのためにもう一度ありがとうございました。あなたの提案された解決策は編集中にカンマがなくなったが、値を編集するためにユーザがセルを2回クリックしなければならないように機能します。私が必要とするのは、タブシーケンスやシングルクリックでセル全体の値が選択され、変更できることです。 –

+0

私の編集をご覧ください。しかし、別の問題がある場合は、新しい質問をしてください。 – mm8

+0

申し訳ありませんmm8、これはまだ同じ問題です。私が期待しているのは、ユーザーがタブをクリックするか、列フィールドをクリックすることです。それから**全体**の内容が強調表示され、ユーザーは数字、カンマ、そして前の内容を上書きする数字を入力することができます。私の元のバージョンでは、小数点までの量の整数部分(つまりコンマ)のみが選択されていました。あなたの提案では、コンマはありません(テキストボックスにはCellEditingTemplateにフォーマットがありません)が、セルの内容は選択されていません。編集するには、ユーザがダブルクリックするか削除する必要があります。 –