Announcement

Collapse
No announcement yet.

[WPF] TextBox in DataGrid aktualisieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [WPF] TextBox in DataGrid aktualisieren

    Hi,

    Ich stelle mir in einem Tool eine DataGrid zusammen, in der ich die Mengen-Angabe editierbar haben möchte.
    Visuell macht er das auch, aber leider sind diese Änderungen in Folgeaktionen scheinbar nicht ersichtlich.

    Meine DataGrid sieht gekürzt so aus (XAML):
    HTML Code:
    <DataGrid Grid.Row="2" Name="gridSummary"
              ItemsSource="{Binding Summary}"
              AlternatingRowBackground="#eee"
              SelectionMode="Single"
              SelectionUnit="FullRow">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Artikel" Width="Auto">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=ArticleSku}" VerticalAlignment="Center" FontSize="14" Padding="5,0"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Matchcode" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Matchcode}" VerticalAlignment="Center" FontSize="14" Padding="5,0"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Menge" Width="Auto">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
    
                            <!-- Um die folgende TextBox geht es -->
    
                            <TextBox Text="{Binding Path=Quantity, Mode=TwoWay}"
                                     HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"
                                     VerticalAlignment="Stretch" VerticalContentAlignment="Center"
                                     FontSize="14"
                                     TextChanged="RefreshSummary"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    Neue Zeilen werden mit einer 1 als default für die TextBox angelegt.
    Ändere ich den Wert nun, und möchte die Items der DataGrid verarbeiten, wird bei allen wieder 1 verwendet?!

    In der Event-Methode RefreshSummary() habe verschiedene Dinge, wie bspw.:
    PHP Code:
    this.gridSummary.Items.Refresh();
    this.gridSummary.UpdateLayout(); 
    probiert, sowie versucht, die komplette Grid neu zu schreiben.

    Auch in den KeyUp und KeyDown Events habe ich mich probiert, aber irgendwie übernimmt er die Änderungen nicht für das entsprechende Item.

    Wie wäre die beste Lösung oder der einfachste Weg?

    Danke für Hinweise und Tipps!
    Gruß Arne

    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    Ok, es hilft - wie so oft - eine Nacht drüber zu schlafen und mit frischem Blick aufs Ganze anzufangen.
    Im TextChanged-Event hatte ich immer versucht, über die TextChangedEventArgs zu gehen und den sender gar nicht berücksichtigt. Der Feld-Wert wird logischer Weise schon mal so aktualisiert ( die Items sind Instanzen der Klasse ArticleSummary ):
    Code:
    ((ArticleSummary)this.gridSummary.SelectedItem).Quantity = ((TextBox)sender).Text;
    this.gridSummary.UpdateLayout();
    Soweit so gut, was die weitere Verarbeitung angeht. Allerdings aktualisiert er die Ansicht nicht.
    Wenn ich Items.Refresh() verwende wird das TextChanged-Event ja endlos aufgerufen.

    Ich habe im TextChanged-Event zusätzlich eine Prüfung über RegEx laufen, das ganze Event sieht so aus:
    Code:
    private void RefreshSummary( object sender, TextChangedEventArgs e ) {
    
        if ( this.gridSummary.Items.Count < 1 || this.gridSummary.SelectedItem == null )
            return;
    
        Regex rx = new Regex( @"[\d,]+" );
        Match m = rx.Match( ((TextBox)sender).Text );
    
        ((ArticleSummary)this.gridSummary.SelectedItem).Quantity = m.Success ? m.Value : "1";
        this.gridSummary.UpdateLayout();
    }
    Der innere Feldwert stimmt bei der weiteren Verarbeitung, bei Eingabe von 2abc liefert er mir wie gewünscht nur die 2 als Wert.
    Allerdings ist die visuelle Darstellung weiterhin die falsche ( 2abc ).

    An welcher Stelle muss ich da noch was aktualisieren?

    Summary ( als ItemsSource-Binding ) ist übrigens so definiert, falls benötigt:
    Code:
    private DataTable _summary;
    public DataTable Summary {
        get { return _summary; }
        set { _summary = value; }
    }
    Danke
    PHP rocks!
    Eine Initiative der PHP Community

    Comment

    Working...
    X