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

C# 如何在DataGrid WPF C中以编程方式选择和聚焦行#,c#,wpf,visual-studio,datagrid,C#,Wpf,Visual Studio,Datagrid,我正在Visual Studio中使用WPF C# 并使用实体框架 我的DataGrid使用数据绑定SQL Server数据库中的表 当用户单击DataGrid中的一行时,该行将显示在文本框和组合框中 单击行的ID位于ID_文本框中 如何在TextBox中按id选择并聚焦一行我在完成TextBox的输入后按返回创建一个演示,以在DataGrid中显示selectedItem: Xaml代码是: <WrapPanel> <DataGrid x:Name="da

我正在Visual Studio中使用WPF C# 并使用实体框架

我的DataGrid使用数据绑定SQL Server数据库中的表

当用户单击DataGrid中的一行时,该行将显示在文本框和组合框中

单击行的ID位于ID_文本框中


如何在TextBox中按id选择并聚焦一行

我在完成TextBox的输入后按
返回
创建一个演示,以在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; }
}
公共部分类主窗口:窗口
{
ObservableCollection memberData=新的ObservableCollection();
公共主窗口()
{
初始化组件();
随机随机随机数=新随机数();
对于(int i=0;i<20;i++)
{
会员人数=新会员人数();
men.IndexNum=i;
男性。Id=“000”+i;
men.Age=radom.Next(100).ToString();
men.Name=“JOE”+i.ToString();
men.Email=newURI(“mailto:JOE”+i.ToString()+“+@school.com”);
成员数据。添加(男性);
}
dataGrid.DataContext=memberData;
}
private void dataGrid_SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
Member Member=dataGrid.SelectedItem作为成员;
myTxt.Text=member.Id.ToString();
}
私有void mytxtu KeyDown(对象发送方,KeyEventArgs e)
{
if(例如Key.ToString()=“Return”)
{
string strId=myTxt.Text;
Member=memberData.Where(m=>m.Id==strId.FirstOrDefault();
if(member==null)返回;
dataGrid.SelectedIndex=member.IndexNum;
DataGridRow行=(DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(member.IndexNum);
MoveFocus(新的遍历请求(FocusNavigationDirection.Next));
}
}
}
公共班级成员
{
public int IndexNum{get;set;}
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串年龄{get;set;}
公共Uri电子邮件{get;set;}
}
它的工作原理如下:

ContainerFromIndex返回空值