У меня есть приложение wpf, в котором есть таблица данных с именами в первом столбце и дополнительной информацией в других столбцах. Имена отсортированы по порядку. Если пользователь нажимает клавишу на клавиатуре, скажем, p, я бы хотел, чтобы сетка данных перешла к первой строке, где имя начинается с p. Если затем пользователь нажимает e, переходит к первой строке, которая начинается с pe и т. д. Возможно ли это в сетке данных? Я не смог найти ничего или примеров по этому поводу. Пожалуйста помоги.
Как выполнить поиск первого столбца в сетке данных при нажатии клавиши пользователем
Ответы:
Для этого вы должны добавить событие keydown. И Шаг 1: событие OnkeyDown получает текст ключа. Шаг 2: найдите товар в соответствии с вашим состоянием из списка. Шаг 3: Изменить выбранный элемент. Шаг 4: и прокрутите таблицу данных до выбранного элемента.
Событие нажатия клавиши окна работает правильно, в моем случае событие 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 = "";
}
Это возможно. Простой пример для Datagrid: http://www.wpf-tutorial.com/datagrid-control/details-row/ Затем обработайте событие keydown в Datagrid.
<DataGrid Name="dgUsers" AutoGenerateColumns="False" KeyDown="DgUsers_OnKeyDown">
код позади простого:
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;
}
}
Это уже встроено!
<DataGrid IsTextSearchEnabled="True" ...
Теперь просто позвольте методу модели «ToString» вернуть текст, который вы хотите найти — готово!
См. также https://msdn.microsoft.com/en-us/library/system.windows.controls.textsearch.aspx