2017-03-12 4 views
0

Ich habe ein seltsames Problem in einer WPF-Anwendung. Der Benutzer soll Rechnungen mit mindestens einer Zeile in ein DataGrid eingeben. Ein Feld enthält den Betrag, so dass es wie i,ff aussieht, d. H. Der ganzzahlige Teil mit mindestens einer Ziffer, einem Komma (ich bin in Europa) und zwei Nachkommastellen.Geldwerte in WPF-Formular bearbeiten

Wenn der Benutzer in das Feld fokussiert, kann der integrale Teil überschrieben werden, das Komma bleibt fixiert und der Bruchteil kann auch überschrieben werden. Der Benutzer gibt also den Integralteil ein und muss dann mit dem Cursor nach rechts über das Komma springen und dann den Bruchteil des Betrags eingeben.

Dieses Verhalten wurde von meinen Benutzern als Buchhalter kritisiert und verwendet, um den gesamten Betrag auf einmal einzugeben. Meine Frage ist also: Gibt es eine Möglichkeit, das gesamte Feld überschreibbar zu machen? Hier

ist das XAML für das Datagrid-Spalte:

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

Die Zelle Stil ist:

<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> 

Irgendwelche Ideen, was dieses Verhalten verursacht?

Antwort

1

Sie können die DataGridTextColumn mit einem DataGridTemplateColumn ersetzen und die StringFormat gelten nur für die Nur-Lese-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> 

Dann sollte der Wert in den editierbare TextBox ohne spezifisches Format präsentiert werden.

Edit:

Ihre vorgeschlagene Lösung funktioniert, so dass während der Bearbeitung durch Komma ist verschwunden, aber der Benutzer zweimal auf der Zelle klicken, um den Wert zu bearbeiten. Was ich brauche, ist, dass mit Tab-Sequenz oder mit einem einzigen Klick der gesamte Zellwert ausgewählt und geändert werden kann.

Dies ist eine neue Frage/Problem, nicht wahr?

Wie dem auch sei, könnten Sie die GotFocus Ereignis für die DataGrid Griff:

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

Edit 2:

Was ich erwarte, ist der Benutzer auf die Registerkarte oder klicken Sie in die Spalte Feld. Dann sollte der gesamte Inhalt hervorgehoben werden und der Benutzer kann einen Betrag eingeben, der aus Ziffern, einem Komma und weiteren Ziffern besteht, die den vorherigen Inhalt überschreiben.

Versuchen Sie, die Veranstaltung wie dieser dann zu handhaben:

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

mm8 danke Ihnen nochmals für Ihre Hilfe:

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); } } 

Sie können auch die StringFormat auf die TextBox anwenden möchten.Ihre vorgeschlagene Lösung funktioniert so, dass während der Bearbeitung das Komma weg ist, aber der Benutzer zweimal auf die Zelle klicken muss, um den Wert zu bearbeiten. Was ich brauche, ist, dass mit Tab-Sequenz oder mit einem einzigen Klick der gesamte Zellwert ausgewählt und geändert werden kann. –

+0

Bitte sehen Sie meine Bearbeitung. Aber bitte stellen Sie eine neue Frage, wenn Sie ein anderes Problem haben. – mm8

+0

Sorry mm8, das ist immer noch das gleiche Problem. Was ich erwarte, ist, dass der Benutzer in das Spaltenfeld klickt oder klickt. Dann sollte ** der gesamte Inhalt hervorgehoben werden und der Benutzer kann einen Betrag eingeben, der aus Ziffern, einem Komma und wieder Ziffern besteht, die den vorherigen Inhalt überschreiben. Bei meiner ursprünglichen Version wurde nur der ganzzahlige Teil des Betrags bis zum Komma (dh Komma) ausgewählt. Mit Ihrem Vorschlag gibt es kein Komma (da die Textbox kein Format in der CellEditingTemplate hat), aber der Inhalt der Zelle ist nicht ausgewählt und um sie zu bearbeiten, muss der Benutzer darauf doppelklicken oder löschen –