我在更改DataGrid行的颜色时遇到问题,我使用以下函数
int i = 0;
private void gvDados_LoadingRow(object sender, DataGridRowEventArgs e)
{
DataGridRow rowContext = e.Row;
if (rowContext != null)
{
string Situacao = dt.Rows[i]["Situacao"].ToString();
if (Situacao.Equals("V"))
{
SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 104,0));
rowContext.Background = brush;
}
else
{
SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 232,0));
rowContext.Background = brush;
}
i++;
}
}
到目前为止,我可以根据自己的需要调整颜色,问题是当我使用水平滚动条向下移动寄存器或爬升时,所有颜色都是错误配置的,随机出现。如何解决此问题,以便在滚动时不会改变?
答案 0 :(得分:1)
只要LoadingRow
被'实例化',DataGrid
Row
事件就会触发。当您滚动行进入和退出作用域时,会对“加载”到视图中的每一行重复触发此事件。
假设您的某个事件(例如按钮点击或某些操作)加载了DataGrid
,您可能需要在将数据实际加载到DataGrid
时对行进行着色,最好是使用为此编写的函数,如果内容发生更改并且您希望根据更改的内容显示颜色,稍后再次调用该函数。
这样的事情:
// This could be a button event, or some other event after which you load data into the DataGrid
void ButtonLoadEvent()
{
foreach(Datagrid Row)
{
FunctionThatChangesRowColor(Row);
}
}
修改强>
有关如何获取DataGrid行和应用着色的实际代码。这是着色逻辑的修改版本,此处每行的颜色取决于其行索引是奇数还是偶数。您可以将其替换为您的代码。
将整个DataGrid
传递给此函数。
private void ColorRow(DataGrid dg)
{
for (int i = 0; i < dg.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
if (row != null)
{
int index = row.GetIndex();
if (index % 2 == 0)
{
SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 104, 0));
row.Background = brush;
}
else
{
SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 232, 0));
row.Background = brush;
}
}
}
}
但是,当你使用WPF而不是WinForms时,这也不是一个完美的解决方案。我有一个建议是采用WPF DataBinding方法,让XAML为你做颜色编码。
This是我经常用于此目的的代码示例。
WPF方法代码:
<Window x:Class="ColorLibrary.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ColorLibrary"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="MainWindow" Height="500" Width="400">
<Window.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Style.Setters>
<Setter Property="Background" Value="{Binding Path=Code}"></Setter>
</Style.Setters>
</Style>
</Window.Resources>
<Grid>
<!-- Stuff -->
<DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2"
Name="dgvColors"
AutoGenerateColumns="False"
Margin="4">
<DataGrid.Columns>
<DataGridTemplateColumn Header="#" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Num}" VerticalAlignment="Center" Padding="3"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="HTML Code" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Code}" VerticalAlignment="Center" Padding="3"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Color" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Color}" VerticalAlignment="Center" Padding="3"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
在,
<Setter Property="Background" Value="{Binding Path=Code}"></Setter>
Code
是类中的一个属性,它包含用于为单元格着色的颜色名称。
然后我们有一个ObservableCollection
个类对象。您需要将此属性(ObservableCollection
中的每个项目)设置为每行显示所需的颜色。