WPF 自带了一个表格控件datagrid,这个控件类似winfrom中的datagridview,在数据显示的时候也经常会用到,这节主要讲解如何从后台代码获取到单元格控件并改变其相关属性:背景色、前景色、字体等。
namespace
Caliburn.Micro.Hello
{
///
<summary>
///
ShellView.xaml 的交互逻辑
///
</summary>
public
partial
class
ShellView
:
UserControl
{
public
ShellView
(
)
{
InitializeComponent;
}
private
void
DG_SelectedCellsChanged
(
object
sender, SelectedCellsChangedEventArgs e
)
{
int
colindex =
-1
;
int
rowindex =
-1
;
//方法1
//DataGridCellInfo info = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
//方法2
//foreach (DataGridCellInfo info in this.dgSourceData.SelectedCells)
//{
// string str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;
// Console.WriteLine(str);
//}
//方案1
var
info =
this
.dgSourceData.SelectedCells.FirstOrDefault;
var
str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;
//((TextBlock)info.Column.GetCellContent(info.Item)).Foreground = new SolidColorBrush(Colors.Red);
//Console.WriteLine(str);
//方案2
colindex =
this
.dgSourceData.CurrentCell.Column.DisplayIndex;
//获取选中单元格列号
//rowindex = this.dgSourceData.SelectedIndex;//获取选中单元格行号
for
(
int
i =
0
; i < ShellViewModel.StudentList.Count; i++)
{
if
(ShellViewModel.StudentList[i] ==
this
.dgSourceData.CurrentItem)
{
//MessageBox.Show("当前选择的行是:" + i.ToString);
rowindex = i;
}
}
DataGridRow row = (DataGridRow)dgSourceData.ItemContainerGenerator.ContainerFromIndex(rowindex);
//获取选中单元格所在行
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
//函数调用,获取行中所有单元格的集合
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(colindex);
//锁定选中单元格(重点)
if
(cell !=
null
)
{
TextBlock tb = cell.Content
as
TextBlock;
Console.WriteLine(tb.Text);
dgSourceData.ScrollIntoView(row, dgSourceData.Columns[colindex]);
//cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(colindex);
cell.Focus;
cell.Background =
new
SolidColorBrush(Colors.Red);
//OK!问题解决,选中单元格变色
cell.Foreground =
new
SolidColorBrush(Colors.Yellow);
cell.FontSize =
20
;
}
}
private
void
dgSourceData_BeginningEdit
(
object
sender, DataGridCellEditEndingEventArgs e
)
{
}
///
<summary>
///
获取父可视对象中第一个指定类型的子可视对象
///
</summary>
///
<typeparam name="T">
可视对象类型
</typeparam>
///
<param name="parent">
父可视对象
</param>
///
<returns>
第一个指定类型的子可视对象
</returns>
public
static
T GetVisualChild<T>(Visual parent)
where
T : Visual
{
T childContent =
default
(T);
int
numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for
(
int
i =
0
; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
childContent = v
as
T;
if
(childContent ==
null
)
{
childContent = GetVisualChild<T>(v);
}
if
(childContent !=
null
)
{
break
; }
}
return
childContent;
}
public
void
dgSourceData_SelectionChanged
(
object
sender, SelectionChangedEventArgs e
)
{
MessageBox.Show(
1111.
ToString);
//SelectionMode="Extended" SelectionUnit="Cell" 模式下触发不了
}
}
}
前台xaml:
<
DataGrid
Name
=
"dgSourceData"
AutoGenerateColumns
=
"False"
ItemsSource
=
"{Binding StudentList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ContextMenu
=
"{Binding menu1}"
RowHeaderWidth
=
"30"
SelectedItem
=
"{Binding SelectedItems}"
SelectionMode
=
"Single"
SelectionUnit
=
"Cell"
cal:Message.Attach
=
"[Event SelectionChanged]=[GridControl_SelectionChanged($source,$eventArgs)];"
SelectedCellsChanged
=
"DG_SelectedCellsChanged"
CellEditEnding
=
"dgSourceData_BeginningEdit"
SelectionChanged
=
"dgSourceData_SelectionChanged"
>
<
DataGrid.Columns
>
<
DataGridTextColumn
Header
=
"Name"
Binding
=
"{ Binding Path=Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
MinWidth
=
"68"
/>
<
DataGridTextColumn
Header
=
"Age"
Binding
=
"{ Binding Path=Age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
MinWidth
=
"68"
/>
<
DataGridTextColumn
Header
=
"Id"
Binding
=
"{ Binding Path=Id,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
MinWidth
=
"48"
/>
</
DataGrid.Columns
>
</
DataGrid
>
04
—
解析
① 因为我需要绑定SelectedCellsChanged事件,所以前台将默认的行选中模式修改为单元格选中模式:
SelectionMode=
"Single"
SelectionUnit=
"Cell"
这样修改后SelectionChanged这个事件将不再触发(只有在行选中模式下生效);
②获取选中单元格的值:
var
info =
this
.dgSourceData.SelectedCells.FirstOrDefault;
var
str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;
③获取选中的列号:
colindex =
this
.dgSourceData.CurrentCell.Column.DisplayIndex;
//获取选中单元格列号
④获取选中行的行号
在SelectionUnit="FullRow" 时候:
可以通过这样获取:
rowindex =
this
.dgSourceData.SelectedIndex;
//获取选中单元格行号
在当SelectionUnit="Cell"时:
我是通过选中单元格对应行的信息和表格控件绑定的集合匹配获取行号的:
var
info =
this
.dgSourceData.SelectedCells.FirstOrDefault;
var
str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;
((TextBlock)info.Column.GetCellContent(info.Item)).Foreground =
new
SolidColorBrush(Colors.Red);
05
—
源码下载
技术群:添加小编微信并备注进群
公众号:dotNet编程大全
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
发布于:
山西省