c# – 如果找到则突出显示单元格

前端之家收集整理的这篇文章主要介绍了c# – 如果找到则突出显示单元格前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个datagrid,绑定到数据表后输出90行.行值为1-90递增.

我想要实现的目标:

如果在数组/范围/数字列表中找到该数字,则将其突出显示为绿色.

我设法让它基于1值突出显示单元格,但是如果在范围内找到它们,我想要突出显示几个单元格.

<DataGrid Name="grid" ItemsSource="{Binding}" Height="300" Width="900"
          AutoGenerateColumns="False"
          VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center" VerticalAlignment="Top" RowHeight="40">
            <DataGrid.Resources>
                <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <Trigger Property="Text" Value="1">
                            <Setter Property="Background" Value="LightGreen" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=Number}" 
            ElementStyle="{StaticResource BackgroundColourStyle}" MinWidth="40">
                </DataGridTextColumn>
            </DataGrid.Columns>

            <DataGrid.ItemsPanel>
                <ItemsPanelTemplate>                    
                    <WrapPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </DataGrid.ItemsPanel>
        </DataGrid>

你可以看到我有一个值为1的触发器属性.这样可以正常工作,但是如上所述,如何更改此值,如果单元格位于后端c#中设置的范围内,则将其高亮显示为绿色.

绑定到datatable:

calledGrid.DataContext = calledNumbers.DefaultView;

数据表的实际制作:

DataSet dataSet = new DataSet("myDS");
            this.bingoCalls(dataSet);
            DataTable numbersTable = new DataTable("Numbers");
            numbersTable.Columns.Add("Number",typeof(Int32));

            for (int i = 1; i < 91; i++)
            {
                numbersTable.Rows.Add(i);
            }
            dataSet.Tables.Add(numbersTable);

谢谢你的帮助.如果您需要更多信息,或者我一直在模糊或不清楚任何事情,请询问,我会尽我所能尽快回复.也请原谅我可能有的任何无知,我对wpf很新.我会尽我所能.

解决方法

您可以使用IMultiValueConverter实现该功能,如果Text位于范围内,则返回true,否则返回false.根据转换器返回的值,更改背景颜色.

将三个参数传递给转换器:

>实际文本值.
>最低价值.
>最大价值.

变流器

public class ItemExistInRangeConverter : IMultiValueConverter
{
    public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture)
    {
        bool itemsExistInRange = false;
        if (values.Length == 3)
        {
            int outputValue = int.MinValue;
            if (Int32.TryParse(values[0].ToString(),out outputValue))
            {
                int minValue = (int)values[1];
                int maxValue = (int)values[2];
                itemsExistInRange = minValue <= outputValue
                                     && outputValue <= maxValue;
            }
        }
        return itemsExistInRange;
    }

    public object[] ConvertBack(object value,Type[] targetTypes,CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML

<DataGrid.Resources>
    <local:ItemExistInRangeConverter x:Key="ItemExistInRangeConverter"/>
    <sys:Int32 x:Key="MinimumValue">1</sys:Int32>
    <sys:Int32 x:Key="MaximumValue">50</sys:Int32>
    <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}">
       <Style.Triggers>
          <DataTrigger Value="True">
             <DataTrigger.Binding>
                 <MultiBinding Converter="{StaticResource ItemExistInRangeConverter}">
                     <Binding Path="Text" RelativeSource="{RelativeSource Self}"/>
                     <Binding Source="{StaticResource MinimumValue}"/>
                     <Binding Source="{StaticResource MaximumValue}"/>
                 </MultiBinding>
             </DataTrigger.Binding>
             <Setter Property="Background" Value="LightGreen" />
          </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

确保在根级别添加相应的命名空间:

xmlns:local="clr-namespace:NamespaceOfConverter"
// Replace NamespaceOfConverter with namespace where converter resides.
xmlns:sys="clr-namespace:System;assembly=mscorlib"

更新(如果想要在数组中查找项目)

假设您的数字数组属性存在于代码隐藏或视图模型类中.

首先,您需要将DataGrid的ItemsSource设置为DataTable而不是DataContext.

其次,将DataGrid的DataContext设置为后面的代码viewmodel类的实例.

另外,要刷新GUI,您的类应该实现INotifyPropertyChanged接口.

现在,假设你有一个属性说:

public int[] RangeNumbers { get; set; }

默认情况下,它将包含您要突出显示的数字列表.

XAML将如下所示:

<DataGrid.Resources>
    <local:ItemExistInRangeConverter x:Key="ItemExistInRangeConverter"/>
       <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}">
           <Style.Triggers>
              <DataTrigger Value="True">
                 <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource ItemExistInRangeConverter}">
                       <Binding Path="Text" RelativeSource="{RelativeSource Self}"/>
                       <Binding Path="DataContext.RangeNumbers" 
                                RelativeSource="{RelativeSource FindAncestor,AncestorType=DataGrid}"/>
                    </MultiBinding>
                 </DataTrigger.Binding>
               <Setter Property="Background" Value="LightGreen" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

转换器代码

public class ItemExistInRangeConverter : IMultiValueConverter
{
    public object Convert(object[] values,CultureInfo culture)
    {
        bool itemsExistInRange = false;
        if (values.Length == 2)
        {
            int outputValue = int.MinValue;
            int[] rangeNumbers = (int[])values[1];
            if (rangeNumbers != null && 
                Int32.TryParse(values[0].ToString(),out outputValue))
            {
                itemsExistInRange = rangeNumbers.Contains(outputValue);
            }
        }
        return itemsExistInRange;
     }

     public object[] ConvertBack(object value,CultureInfo culture)
     {
         throw new NotImplementedException();
     }
}

现在,将根据RangeNumbers中的初始数字突出显示项目.但是假设您之后更新了数组,则需要引发属性更改事件,以便GUI刷新如下:

RangeNumbers = new int[] { 23,45,47,69 };
OnPropertyChanged("RangeNumbers");

猜你在找的C#相关文章