改变DataGrid某一行和单元格的颜色

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

前段时间做WPF项目,需要改变DataGrid某一行的颜色、高度,以及某个单元格的颜色、单元格字体的颜色,自然就必需取到datagrid的一行和一行的单元格,网上也是搜索了好久才找到,记录下来便于使用。

1、前台WPF界面添加一个DataGrid控件,并添加两列(便于编写,达到目的即可)

<DataGrid AutoGenerateColumns="False"Height="642"HorizontalAlignment="Left"Margin="131,57,0,0"Name="dataGrid1"VerticalAlignment="Top"Width="799"CanUserAddRows="True"LoadingRow="dataGrid1_LoadingRow"GridLinesVisibility="None">

<DataGrid.ColumnHeaderStyle >

<Style TargetType="DataGridColumnHeader">

<SetterPRoperty="Height"Value="50"></Setter>

</Style>

</DataGrid.ColumnHeaderStyle>

<DataGrid.Columns>

<DataGridTextColumn Header="id"Binding="{Binding Path=id}"ElementStyle="{StaticResource dgCell}"></DataGridTextColumn>

<DataGridTextColumn Header="name"Binding="{Binding Path=name}"ElementStyle="{StaticResource dgCell}"></DataGridTextColumn>

</DataGrid.Columns>

</DataGrid>

View Code

2、创建一个数据源并绑定,此处是创建一个datatable

DataTable dt =newDataTable();

dt.Columns.Add(newDataColumn("id",typeof(int)));

dt.Columns.Add(newDataColumn("name",typeof(string)));for(inti =0; i <6; i++)

{

DataRow dr=dt.NewRow();if(i ==3)

{

dr["id"] =DBNull.Value;

dr["name"] =DBNull .Value ;

dt.Rows.Add(dr);

}else{

dr["id"] =i;

dr["name"] ="tom"+i.ToString();

dt.Rows.Add(dr);

}

}this.dataGrid1.CanUserAddRows =false;this.dataGrid1.ItemsSource = dt.DefaultView;

View Code

3、获取单行

for(inti =0; i <this.dataGrid1.Items.Count; i++)

{

DataRowView drv= dataGrid1.Items[i]asDataRowView;

DataGridRow row= (DataGridRow)this.dataGrid1.ItemContainerGenerator.ContainerFromIndex(i);if(i ==2)

{

row.Height=50;

row.Background=newSolidColorBrush(Colors.Blue);

drv["id"] =333;

}if(drv["id"] ==DBNull.Value)

{

row.Background=newSolidColorBrush(Colors.Green);

row.Height=8;

}

}

4、获取单元格

for(inti =0; i <this.dataGrid1.Items.Count; i++)

{

DataRowView drv= dataGrid1.Items[i]asDataRowView;

DataGridRow row= (DataGridRow)this.dataGrid1.ItemContainerGenerator.ContainerFromIndex(i);

if(i ==4)

{

DataGridCellsPresenter presenter= GetVisualChild<DataGridCellsPresenter>(row);

DataGridCell cell= (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(1);

cell.Background=newSolidColorBrush(Colors.Red);

}}

publicstaticT GetVisualChild<T>(Visual parent)whereT : Visual

{

T childContent=default(T);intnumVisuals =VisualTreeHelper.GetChildrenCount(parent);for(inti =0; i < numVisuals; i++)

{

Visual v=(Visual)VisualTreeHelper.GetChild(parent, i);

childContent= vasT;if(childContent ==null)

{

childContent= GetVisualChild<T>(v);

}if(childContent !=null)

{

break;

}

}returnchildContent;

}

5、如果在项目中把创建数据源、绑定数据源、对datagrid进行操作(改变行的颜色、高度)都写在一个事件中,其中在取datagrid的row时出现错误:未将对象引用设置到对象的实例。

解决的方法:

//创建数据源、绑定数据源

if(!Window.GetWindow(dataGrid1).IsVisible)

{

Window.GetWindow(dataGrid1).Show();

}

dataGrid1.UpdateLayout();

//可以获取某一行、某一行的单元格

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航