gpt4 book ai didi

c# - 高亮显示找到的单元格

转载 作者:太空狗 更新时间:2023-10-29 21:34:05 27 4
gpt4 key购买 nike

我有一个数据网格,它在绑定(bind)到数据表后输出 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# 中设置的范围内,则将其突出显示为绿色。

绑定(bind)到数据表:

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。 根据转换器返回的值,改变背景颜色

传递三个参数给转换器:

  1. 实际文本值。
  2. 最小值。
  3. 最大值。

转换器

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,
object parameter, 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"

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

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

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

其次,从代码隐藏或 viewModel 类的实例中将 DataGrid 的 DataContext 设置为此

此外,要刷新 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, Type targetType,
object parameter, 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, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

现在,项目将根据 RangeNumbers 中的初始数字突出显示。但是假设你之后更新数组,你需要引发属性更改事件,以便 GUI 像这样刷新:

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

关于c# - 高亮显示找到的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20660577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com