简体   繁体   English

如何在 DataGrid 中以编程方式 Select 和聚焦一行 WPF C#

[英]How to Select and Focus a row Programmatically in DataGrid WPF C#

I'm Using WPF C# in Visual Studio and using Entity Framework我在 Visual Studio 中使用 WPF C# 并使用实体框架

My DataGrid Binding a Table in Database of SQL Server with Data我的 DataGrid 将 SQL 服务器数据库中的表与数据绑定

when user click on a row in DataGrid that row will show in the textbox and Combobox当用户单击 DataGrid 中的一行时,该行将显示在文本框中和 Combobox

the ID of row clicked is in ID_TextBox单击的行的 ID 在 ID_TextBox 中

how can i select and focus on a row by id in TextBox我如何 select 并在 TextBox 中按 id 关注一行

I create a demo with pressing Return after finishing inputing for TextBox to show the selectedItem in DataGrid:我在完成输入 TextBox 后按Return创建了一个演示,以在 DataGrid 中显示 selectedItem:

The Xaml code is: 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>

The cs code is: 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; }
}

And it works like below:它的工作原理如下: 在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM