【问题标题】:How to Select and Focus a row Programmatically in DataGrid WPF C#如何在 DataGrid WPF C# 中以编程方式选择和聚焦一行
【发布时间】:2021-03-15 22:02:53
【问题描述】:

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

My DataGrid 将 SQL Server 数据库中的表与数据绑定

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

点击的行ID在ID_TextBox中

如何在 TextBox 中按 id 选择并关注一行

【问题讨论】:

    标签: c# wpf visual-studio datagrid


    【解决方案1】:

    我在完成 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; }
    }
    

    它的工作原理如下:

    【讨论】:

    • ContainerFromIndex 返回 null
    猜你喜欢
    • 2012-10-23
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多