none
孤独的程序员在线求救,help!!help RRS feed

  • 问题

  • 纠结多天,刚接触wpf,现想让datagrid自动增加的行特定单元格获得焦点。
    具体描述:
       datagrid表格用于增加商品,第一列是商品编号,第二列是数量。在商品编号列中输入编号后检索出商品信息按Enter 键光标就跳到第二列的数量上去,输入数量后按Enter 键再跳到新增加的行的第一列商品编号里,如此重复。哪位高手知道这个怎么整,多谢了。。。

    在数量里面输入数量后,按enter 键,datagrid 会自动增加新行,但是光标不跳到第一列去,而是在数量下面

    2013年4月16日 7:45

答案

  • 你好,

    你可以通过UIElement.MoveFocus Method  datagridcells依次获取焦点。鉴于你需要在datagrid中不断的新增行,所以你需要增加一个判断,即:当焦点到达所有行的倒数第二行的最后一列时,将焦点至于最后一行(datagrid的自动增加的新行)的第一列。这些处理可以放在datagrid 的

    PreviewKeyDown事件中处理。

    下面是一个简单的code sample 可以尝试一下:

     

     <DataGrid Name="dg" PreviewKeyDown="dg_PreviewKeyDown_1" AutoGenerateColumns="True" >
            
        </DataGrid>
     public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                dg.ItemsSource = CreateTable().DefaultView;
            }
    
            public DataTable CreateTable()
            {
                DataTable dt = new DataTable();
    
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Number", typeof(double)); 
    
                dt.Rows.Add("A", 123456789456);
                dt.Rows.Add("B", 120);
                dt.Rows.Add("C", 789);
               
                return dt;
    
            }
    
            private void dg_PreviewKeyDown_1(object sender, KeyEventArgs e)         
          {
              DataGrid dg = sender as DataGrid;
              UIElement uie = e.OriginalSource as UIElement;
    
              if (dg != null)
              {
                  if (e.Key == Key.Enter)
                  {
                      if (dg.Columns.IndexOf(dg.CurrentColumn) == dg.Columns.Count - 1 && dg.SelectedIndex == dg.Items.Count - 2)
                      {
                          //change the selected item to the last row
                          dg.SelectedItem = dg.Items[dg.Items.Count - 1];
    
                          //change the current cell to the first cell in the last row
                          dg.CurrentCell = new DataGridCellInfo(dg.SelectedItem, dg.Columns[0]);
                      }
                      else
                      {
                          uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                      }
    
                      e.Handled = true;
    
                      dg.BeginEdit();
                  }
              }
            }
    }

    另外,这里也有Enter键“导航”焦点的相关讨论你可以参考下:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a43a277e-3392-42dd-a068-c667b5bad123/


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 hf_yy0528 2013年4月17日 11:08
    2013年4月17日 3:13
    版主
  • Lisa Zhu ,您好,非常感谢。按您的提示,问题解决了。 一个人做开发,有问题都找不到人。还是这里面大师多。在csdn 上多次求助,没人回复。


    • 已标记为答案 hf_yy0528 2013年4月17日 11:08
    • 已编辑 hf_yy0528 2013年4月17日 11:10
    2013年4月17日 11:08

全部回复

  • 你好,

    你可以通过UIElement.MoveFocus Method  datagridcells依次获取焦点。鉴于你需要在datagrid中不断的新增行,所以你需要增加一个判断,即:当焦点到达所有行的倒数第二行的最后一列时,将焦点至于最后一行(datagrid的自动增加的新行)的第一列。这些处理可以放在datagrid 的

    PreviewKeyDown事件中处理。

    下面是一个简单的code sample 可以尝试一下:

     

     <DataGrid Name="dg" PreviewKeyDown="dg_PreviewKeyDown_1" AutoGenerateColumns="True" >
            
        </DataGrid>
     public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                dg.ItemsSource = CreateTable().DefaultView;
            }
    
            public DataTable CreateTable()
            {
                DataTable dt = new DataTable();
    
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Number", typeof(double)); 
    
                dt.Rows.Add("A", 123456789456);
                dt.Rows.Add("B", 120);
                dt.Rows.Add("C", 789);
               
                return dt;
    
            }
    
            private void dg_PreviewKeyDown_1(object sender, KeyEventArgs e)         
          {
              DataGrid dg = sender as DataGrid;
              UIElement uie = e.OriginalSource as UIElement;
    
              if (dg != null)
              {
                  if (e.Key == Key.Enter)
                  {
                      if (dg.Columns.IndexOf(dg.CurrentColumn) == dg.Columns.Count - 1 && dg.SelectedIndex == dg.Items.Count - 2)
                      {
                          //change the selected item to the last row
                          dg.SelectedItem = dg.Items[dg.Items.Count - 1];
    
                          //change the current cell to the first cell in the last row
                          dg.CurrentCell = new DataGridCellInfo(dg.SelectedItem, dg.Columns[0]);
                      }
                      else
                      {
                          uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                      }
    
                      e.Handled = true;
    
                      dg.BeginEdit();
                  }
              }
            }
    }

    另外,这里也有Enter键“导航”焦点的相关讨论你可以参考下:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a43a277e-3392-42dd-a068-c667b5bad123/


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 hf_yy0528 2013年4月17日 11:08
    2013年4月17日 3:13
    版主
  • Lisa Zhu ,您好,非常感谢。按您的提示,问题解决了。 一个人做开发,有问题都找不到人。还是这里面大师多。在csdn 上多次求助,没人回复。


    • 已标记为答案 hf_yy0528 2013年4月17日 11:08
    • 已编辑 hf_yy0528 2013年4月17日 11:10
    2013年4月17日 11:08