如何在 DataGrid WPF C# 中以编程方式 Select 和聚焦一行
How to Select and Focus a row Programmatically in DataGrid WPF C#
我在 Visual Studio 中使用 WPF C#
并使用 Entity Framework
我的 DataGrid 将 SQL 服务器的数据库中的 Table 与数据绑定
当用户单击 DataGrid 中的一行时,该行将显示在文本框和组合框中
点击的行ID在ID_TextBox
我怎样才能 select 并通过 TextBox 中的 id 关注一行
我在完成 TextBox 的输入后按 Return
创建了一个演示,以在 DataGrid 中显示 selectedItem:
Xaml代码是:
<WrapPanel>
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionMode="Extended" SelectionUnit="FullRow" SelectionChanged="dataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Width="80" Binding="{Binding Id}" IsReadOnly="True" />
<DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Age" Width="50" Binding="{Binding Age}" />
<DataGridHyperlinkColumn Header="Email" Width="150"
Binding="{Binding Email}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel>
<TextBox Name="myTxt" Text="{Binding Name}" Width="120" Height="40" Background="Azure" KeyDown="myTxt_KeyDown" />
</StackPanel>
</WrapPanel>
cs代码为:
public partial class MainWindow : Window
{
ObservableCollection<Member> memberData = new ObservableCollection<Member>();
public MainWindow()
{
InitializeComponent();
Random radom = new Random();
for (int i = 0; i < 20; i++)
{
Member men = new Member();
men.IndexNum = i;
men.Id = "000"+i;
men.Age = radom.Next(100).ToString();
men.Name = "JOE" + i.ToString();
men.Email = new Uri("mailto:JOE" + i.ToString() + "+@school.com");
memberData.Add(men);
}
dataGrid.DataContext = memberData;
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Member member = dataGrid.SelectedItem as Member;
myTxt.Text = member.Id.ToString();
}
private void myTxt_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.ToString() == "Return")
{
string strId = myTxt.Text;
Member member = memberData.Where(m => m.Id == strId).FirstOrDefault();
if (member == null) return;
dataGrid.SelectedIndex = member.IndexNum;
DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(member.IndexNum);
row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
}
public class Member
{
public int IndexNum { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public Uri Email { get; set; }
}
它的工作原理如下:
我在 Visual Studio 中使用 WPF C# 并使用 Entity Framework
我的 DataGrid 将 SQL 服务器的数据库中的 Table 与数据绑定
当用户单击 DataGrid 中的一行时,该行将显示在文本框和组合框中
点击的行ID在ID_TextBox
我怎样才能 select 并通过 TextBox 中的 id 关注一行
我在完成 TextBox 的输入后按 Return
创建了一个演示,以在 DataGrid 中显示 selectedItem:
Xaml代码是:
<WrapPanel>
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionMode="Extended" SelectionUnit="FullRow" SelectionChanged="dataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Width="80" Binding="{Binding Id}" IsReadOnly="True" />
<DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Age" Width="50" Binding="{Binding Age}" />
<DataGridHyperlinkColumn Header="Email" Width="150"
Binding="{Binding Email}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel>
<TextBox Name="myTxt" Text="{Binding Name}" Width="120" Height="40" Background="Azure" KeyDown="myTxt_KeyDown" />
</StackPanel>
</WrapPanel>
cs代码为:
public partial class MainWindow : Window
{
ObservableCollection<Member> memberData = new ObservableCollection<Member>();
public MainWindow()
{
InitializeComponent();
Random radom = new Random();
for (int i = 0; i < 20; i++)
{
Member men = new Member();
men.IndexNum = i;
men.Id = "000"+i;
men.Age = radom.Next(100).ToString();
men.Name = "JOE" + i.ToString();
men.Email = new Uri("mailto:JOE" + i.ToString() + "+@school.com");
memberData.Add(men);
}
dataGrid.DataContext = memberData;
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Member member = dataGrid.SelectedItem as Member;
myTxt.Text = member.Id.ToString();
}
private void myTxt_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.ToString() == "Return")
{
string strId = myTxt.Text;
Member member = memberData.Where(m => m.Id == strId).FirstOrDefault();
if (member == null) return;
dataGrid.SelectedIndex = member.IndexNum;
DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(member.IndexNum);
row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
}
public class Member
{
public int IndexNum { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public Uri Email { get; set; }
}
它的工作原理如下: