【问题标题】:Changing DataCell color changes other cells background更改 DataCell 颜色会更改其他单元格背景
【发布时间】:2018-06-05 23:53:46
【问题描述】:

我有一个 DataGrid,我在运行时使用 SQLite 数据库中的数据填充它。当用户编辑数据网格中的单元格时,我希望该单元格更改其背景颜色。所以,这是我所做的 MCVE 代码隐藏:

public MainWindow()
{
    InitializeComponent();
    DataTable dt = new DataTable();
    dt.Columns.Add("Column1");
    dt.Columns.Add("Column2");
    for (int i = 0; i < 100; i++)
    {
        var r = dt.NewRow();
        r[0] = i ;
        r[1] = i * i;
        dt.Rows.Add(r);
    }
    myDataGrid.ItemsSource = dt.DefaultView;
}

private void myDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (e.EditAction.ToString() == "Commit")
    {
        FrameworkElement element = e.Column.GetCellContent(e.Row);
        (element.Parent as DataGridCell).Background = new SolidColorBrush(Colors.Yellow);
    }
}

xaml:

<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding"/>
</Grid>

问题是,每当我滚动时,我看到其他单元格也涂成黄色。此外,根据我滚动的方式,黄色背景会从我想要的单元格跳到另一个单元格。仅当 EnableRowVirtualization 设置为 true 时才会发生这种情况。有没有办法在不禁用它的情况下做到这一点,或者这是正确的方法?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    我在网上找到了这个解决方案。我不知道这是否是正确的方法。我猜这取决于你。

    我刚刚将 VirtualizingStackPanel.VirtualizationMode="Standard" 添加到 xaml:

        <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.VirtualizationMode="Standard" /> 
    

    我执行并看到着色现在不会跳转到其他单元格。

    【讨论】:

    • 您可以从以下链接中看到它。 Example 还有一个名为 CleanUpVirtualizedItem 的函数。也许它会给你一些额外的选择:social.msdn.microsoft.com/Forums/vstudio/en-US/…
    • 这阻止了其他单元格的颜色为黄色,但是,当您滚动时,黄色单元格(所需的单元格)会失去颜色。您提到的CleanUpVirtualizedItem 应该更正此问题,但提供的代码用于行背景,而不是单元格背景
    • 对不起,我在滚动时没有意识到:/
    【解决方案2】:

    因此,根据他的回答评论中的 Shou Risha 链接,我想出了一个解决方案。禁用行虚拟化的问题在于性能和内存,特别是对于大型网格。要继续使用虚拟化并保持背景正确,如果任何行单元格具有背景颜色,我必须取消 CleanUpVirtualizedItem 事件。

    xaml:

    <Grid>
        <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.CleanUpVirtualizedItem="myDataGrid_CleanUpVirtualizedItem"/>
    </Grid>
    

    代码隐藏:

    private void myDataGrid_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e)
    {
        var row = e.UIElement as DataGridRow;
        for(int i = 0; i<(sender as DataGrid).Columns.Count; i++)
        {
            var cell = (DataGridCell)(sender as DataGrid).Columns[i].GetCellContent(row).Parent;
            if (cell.Background != Brushes.White) 
            {
                e.Cancel = true;
                break;
            }
        }            
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2013-04-12
      • 2021-10-31
      • 1970-01-01
      • 2013-06-28
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多