none
DataGrid fehlerhaftes Verhalten beim scrollen. RRS feed

  • Frage

  • Hall,

    ich binde dataGrid per itemsSource = dataTable.DefaultView, dannach per codeBehind ändere Hintergrundfarbe eine Zelle. Soweit geht alles gut. Beim scrollen aber die geänderte Hintergrund wandert in eine andere Zelle je nach Scrollrichtung.  Weis jemand wie und wieso das passiert.

    mfg

    Freitag, 3. Mai 2019 06:27

Alle Antworten

  • Hi,
    um da eine Idee zu Problem zu äußern, müsste man den Code sehen. Per CodeBehind die Zellfarbe zu ändern ist in WPF keine optimale Idee. Besser ist es, die Eigenschaft der Hintergrundfarbe zu binden und falls es vom Typ nicht passt, einen Converter zwischenzuschalten.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Freitag, 3. Mai 2019 07:45
  • Hi,

    danke für die Antwort.

    Ich wollte auch die Hintergrundfarbe zu binden, nur habe keinen Schimmer wie.

    Eigentlich das die Aufgabe selbst ist simple: es gibt eine Tabelle und ein Suchfeld. Gesuchtes Wort soll in der Tabelle markiert werden oder die Zelle wo das Wort sich befindet.

    Hier mein Code

    Window x:Class="WpfApp4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp4"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="30" Margin="665,15,0,0" VerticalAlignment="Top" Width="80" Click="Button_Click"/>
            
            <DataGrid x:Name="DataGridTest" Margin="15,85,15,20" CanUserAddRows="False" CanUserResizeRows="False" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Width="*" Header="Test1" Binding="{Binding Test1}" />
                    <DataGridTextColumn Width="*" Header="Test2" Binding="{Binding Test2}" />
                    <DataGridTextColumn Width="*" Header="Test3" Binding="{Binding Test3}" />
                </DataGrid.Columns>
            </DataGrid>
    
        </Grid>
    </Window>

    public partial class MainWindow:Window {
            public MainWindow() {
                InitializeComponent();
                CreateTable();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e) {
                DataGridRow row = DataGridTest.ItemContainerGenerator.ContainerFromItem(DataGridTest.Items[1]) as DataGridRow;
                DataGridCell cell = DataGridTest.Columns[0].GetCellContent(row).Parent as DataGridCell;
                cell.Background = Brushes.Red;
    
            }
    
            private void CreateTable() {
                var dt = new DataTable();
                string[] Felder;
    
                dt.Columns.Add("Test1");
                dt.Columns.Add("Test2");
                dt.Columns.Add("Test3");
    
                for(int i = 0; i < 50; i++) {
    
                    DataRow dr = dt.NewRow();
                    string s = "row " + i + " colm 1";
                    string s1 = "row " + i + " colm 2";
                    string s2 = "row " + i + " colm 3";
                    Felder = new string[] { s, s1, s2 };
                    dr.ItemArray = Felder;
                    dt.Rows.Add(dr);
                }
    
                DataGridTest.ItemsSource = dt.DefaultView;
            }
    
        }
    Danke
    Freitag, 3. Mai 2019 08:48
  • Das liegt am impliziten Virtualisierungs-Modus des DataGrid. Da werden UI-Elemente beim Scrollen wiederverwendet.

    Füg in XAML in deinen DataGrid-Tag noch folgendes Attribut ein:

    <DataGrid x:Name="DataGridTest" Margin="15,85,15,20" CanUserAddRows="False" CanUserResizeRows="False" AutoGenerateColumns="False" 
                      VirtualizingPanel.VirtualizationMode="Standard">



    Sonntag, 18. August 2019 06:40