C# 如何在DataGrid页面加载时聚焦并开始编辑第一行的第一个单元格
当C# 如何在DataGrid页面加载时聚焦并开始编辑第一行的第一个单元格,c#,wpf,datagrid,C#,Wpf,Datagrid,当UserControl自动加载或页面加载时,我想聚焦并开始编辑第一行的第一个单元格。我已经尝试了很多代码,但还没有找到解决方案。我已经为DataGrid编写了代码: <UserControl x:Class="Inventory_Control.UserControls.FileTab" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="
UserControl
自动加载或页面加载时,我想聚焦并开始编辑第一行的第一个单元格。我已经尝试了很多代码,但还没有找到解决方案。我已经为DataGrid
编写了代码:
<UserControl x:Class="Inventory_Control.UserControls.FileTab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Inventory_Control.UserControls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid Background="#FF2C2929">
<DataGrid DataGridCell.Selected="DataGrid_GotFocus" SelectionUnit="Cell"
SelectionMode="Single" Name="Datagrid" AutoGenerateColumns="False"
PreviewKeyDown="Datagrid_PreviewKeyDown"
CurrentCellChanged="Datagrid_CurrentCellChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="Code" Width="1*" Binding="{Binding Code}"/>
<DataGridTextColumn Header="Code" Width="1*" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
您应该获得要聚焦的单元格的引用。等待元素加载完毕,然后使用
VisualTreeHelper
类:
public FileTab()
{
InitializeComponent();
AddValues();
Loaded += (s, e) =>
{
DataGrid grid = dg;
DataGridRow rowContainer = grid.ItemContainerGenerator.ContainerFromIndex(0) as DataGridRow;
if (rowContainer != null)
{
DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
if (presenter != null)
{
DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(0) as DataGridCell;
if (cell != null)
{
DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
if (!grid.SelectedCells.Contains(dataGridCellInfo))
{
grid.SelectedCells.Add(dataGridCellInfo);
}
grid.CurrentCell = dataGridCellInfo;
grid.BeginEdit();
}
}
}
};
}
private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
else
{
T childOfChild = FindVisualChild<T>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
publicfiletab()
{
初始化组件();
AddValues();
加载+=(s,e)=>
{
DataGrid=dg;
DataGridRow rowContainer=grid.ItemContainerGenerator.ContainerFromIndex(0)作为DataGridRow;
if(rowContainer!=null)
{
DataGridCellsPresenter=FindVisualChild(rowContainer);
如果(演示者!=null)
{
DataGridCell=presenter.ItemContainerGenerator.ContainerFromIndex(0)作为DataGridCell;
如果(单元格!=null)
{
DataGridCellInfo DataGridCellInfo=新的DataGridCellInfo(单元格);
如果(!grid.SelectedCells.Contains(dataGridCellInfo))
{
grid.SelectedCells.Add(dataGridCellInfo);
}
grid.CurrentCell=dataGridCellInfo;
grid.BeginEdit();
}
}
}
};
}
私有静态T FindVisualChild(DependencyObject obj),其中T:DependencyObject
{
for(int i=0;i
public FileTab()
{
InitializeComponent();
AddValues();
Loaded += (s, e) =>
{
DataGrid grid = dg;
DataGridRow rowContainer = grid.ItemContainerGenerator.ContainerFromIndex(0) as DataGridRow;
if (rowContainer != null)
{
DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
if (presenter != null)
{
DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(0) as DataGridCell;
if (cell != null)
{
DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
if (!grid.SelectedCells.Contains(dataGridCellInfo))
{
grid.SelectedCells.Add(dataGridCellInfo);
}
grid.CurrentCell = dataGridCellInfo;
grid.BeginEdit();
}
}
}
};
}
private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
else
{
T childOfChild = FindVisualChild<T>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}