首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改DataCell颜色会更改其他单元格的背景

更改DataCell颜色会更改其他单元格的背景
EN

Stack Overflow用户
提问于 2018-06-05 03:10:46
回答 2查看 112关注 0票数 1

我有一个在运行时用来自SQLite数据库的数据填充的DataGrid。当用户在datagrid中编辑单元格时,我希望该单元格更改其背景颜色。这是我所做的事情背后的MCVE代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding"/>
</Grid>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-05 23:53:47

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

xaml:

代码语言:javascript
复制
<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.CleanUpVirtualizedItem="myDataGrid_CleanUpVirtualizedItem"/>
</Grid>

代码隐藏:

代码语言:javascript
复制
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;
        }
    }            
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-05 06:27:09

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

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

代码语言:javascript
复制
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.VirtualizationMode="Standard" /> 

我执行后发现,着色现在不会跳到其他单元格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档