2017-01-04 7 views
1

私は、最初の列の名前と他の列の追加情報を持つデータグリッドを持つwpfアプリケーションを持っています。名前はソート順です。ユーザーがキーボード上のキー、たとえばpを押すと、名前がpで始まる最初の行にデータグリッドを移動します。ユーザーがeを押すと、peなどで始まる最初の行に移動します。これはデータグリッドで可能ですか?私はこれについて何か事例を見つけることができませんでした。助けてください。ユーザのキー押下でデータグリッドの最初の列を検索するには

答えて

0

可能です。 DataGridの簡単な例:あなたはのKeyDownイベントを追加する必要があり、そのために

private void DgUsers_OnKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
     { 
      foreach (var row in dgUsers.Items) 
      { 
       User user = (User) row; 
       user.Name = e.Key.ToString(); 
       dgUsers.SelectedItem = row; 
       break; 
      } 
     } 
2

http://www.wpf-tutorial.com/datagrid-control/details-row/ 次に簡単なの背後にあるイベントデータグリッド

<DataGrid Name="dgUsers" AutoGenerateColumns="False" KeyDown="DgUsers_OnKeyDown"> 

にKeyDownイベントのコードを処理します。 ステップ1:OnkeyDownイベントはキーのテキストを取得します。 ステップ2:あなたの条件に従ってアイテムをリストから探します。 手順3:選択した項目を変更します。 手順4:DataGridを選択した項目にスクロールします。

私のケースでは、ウィンドウkeydownイベントが正常に動作します。行が選択されたときにDataGridイベントが機能しました。

ここはコードです。

List<Employee> empData = new List<Employee>(); 
private Task task; 
private CancellationToken token; 
private CancellationTokenSource tokenSource; 
private string searchText = ""; 

KeyDownEvent:きれいなテキストの

private void OnKeyDown(object sender, KeyEventArgs e) 
    { 
     if (task != null && tokenSource != null) 
     { 
      // cancel task 
      tokenSource.Cancel(); 
      tokenSource = null; 
      Console.WriteLine("Task cancel"); 
     } 

     // Set condition for key 
     string txt = new KeyConverter().ConvertToString(e.Key); 
     if (txt.ToString().ToList().Any(x => !Char.IsLetterOrDigit(x))) 
     { 
      Console.WriteLine("Retrun from."); 
      return; 
     } 

     searchText = searchText + new KeyConverter().ConvertToString(e.Key); 
     Console.WriteLine("Search text : " + searchText); 

     var item = empData.FirstOrDefault(x=>x.FirstName.StartsWith(searchText)); 
     if (item != null) 
     { 
      myGrid.SelectedItem = item; 
      myGrid.UpdateLayout(); 
      myGrid.ScrollIntoView(myGrid.SelectedItem); 
     } 

     // create task for clean text 
     Console.WriteLine("Task generate"); 
     tokenSource = new CancellationTokenSource(); 
     token = tokenSource.Token; 
     task = new Task(()=> CleanSearchText(token), token); 
     task.Start(); 

    } 

タスクいつか

private void CleanSearchText(CancellationToken token) 
    { 
     // Throw if cancellation request 
     token.ThrowIfCancellationRequested(); 
     // Wait for sometime for next key prss 
     Thread.Sleep(400); 
     // Do nothing if cancelation request 
     if (token.IsCancellationRequested) 
     { 
      return; 
     } 
     Console.WriteLine("Clean text"); 
     searchText = ""; 
    } 
+0

これは受け入れられる回答である必要があります。 –

関連する問題