如何仅以编程方式突出显示行

时间:2019-06-04 11:58:48

标签: c# wpf datagrid background

这是对此处提到的代码的部分响应,该代码部分地对我有用,但并没有达到期望,不幸的是,在WPF中,我无法解决此问题并找到解决方案。因为我找不到功能解决方案,所以我问这个问题。

Get selected row item in DataGrid WPF

试图达到结果

回复

回答了2011年4月19日22:01 通过 巴哈(Bahaa Salaheldin)

最有用

但是发生的是,当我向下滚动时,所选行反复出现,我认为是因为“ ContainerFromItem”方法。 是否可以通过编程方式更改DataGrid的背景? -仅在C#代码中? 我试过的是,我对... selected index有点玩,所以它不像WindowsForms那样容易。所以我试图找出如何执行“突出显示”。 我正在使用的是: 绑定了DataGrid项目的DataObject中的DataTable是dataObject.DataTable 我知道我必须在DataGridRow上执行.Background = Brushes。“ DesiredColor”,但是我不确定DataGrid Selected Index / SelectedItem / SelectedItems和Background属性之间是否存在任何关系 谢谢。

19/06/19添加了更多信息:

我在这里发布示例代码,但是此代码可用于Windows窗体, 我以为我可以做这样的事情。

 foreach (DataGridViewRow row in dgvNetlist.Rows)
            {

                if (row.Cells[2].Value.ToString().Contains(Messages.SingleConnection))
                    row.DefaultCellStyle.BackColor = databaseColor[0];                     //error color                    
                else if (row.Cells[2].Value.ToString().Contains(Messages.MissingTP))
                    row.DefaultCellStyle.BackColor = databaseColor[1];                    
                else if (row.Cells[2].Value.ToString().Contains(Messages.MissingConnection))//if message cell contains missing connections
                    row.DefaultCellStyle.BackColor = databaseColor[2];                    
                else if (row.Cells[2].Value.ToString().Contains(Messages.MultipleTPs) && cbHideMultipleTPs.Checked == false)  //if message cell contains multiple TPs
                    row.DefaultCellStyle.BackColor = databaseColor[3];
                else if (row.Cells[2].Value.ToString().Contains(Messages.EmptyNet))      //if message cell contains Empty net
                    row.DefaultCellStyle.BackColor = databaseColor[0]; 
                else
                    row.DefaultCellStyle.BackColor = databaseColor[4];                  //OK color

                if (row.Cells[4].Value.ToString().Equals("True"))                       //if row is marked -> marked color
                    row.DefaultCellStyle.BackColor = databaseColor[5];
                i++;
            }

但是使用自己的规则,例如,用户必须“保存”某行,他想突出显示该行。 我要做的是分步进行:

1)从选定的ROW中获取项目ID ...项目ID我的意思是表中的原始ID,例如ID号950
2)做一些突出的动作,例如。不同颜色的背景。 3)将ID保存到用户设置,因为每个用户可以在不同的行中突出显示

4)在另一个应用程序启动时,使用一些周期来查找已保存的行(数据库中是否有更多或更少的项目都无关紧要)并突出显示行-顺序如何无关紧要-突出显示取决于项目ID。 ..

我认为可以从datagrid->选定项目中获取ID

但是我找不到像上面发布的代码那样的方法。

希望这将使其更加清晰

1 个答案:

答案 0 :(得分:1)

由于您没有发布任何代码,因此很难说出您到底想要什么。要更改背景颜色,请使用绑定到IsSelected的DataTrigger;如果为true,则将背景颜色设置为所需的突出显示颜色

    <Style TargetType="{x:Type ContentControl}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

更新:如果要以编程方式进行操作,则可以在代码中创建绑定,其中Listboxitem是包含该项的列表框,SelectedToBackgroundConverter是实现您在您的文章中提到的规则的转换器帖子。

        gridLine.SetBinding(BackgroundProperty, new Binding(nameof(IsSelected)) { Source = ListBoxItem, Converter = new SelectedToBackgroundConverter() });

尽管在代码中执行此操作比使用xaml要复杂得多。