Member Albert Ответов: 2

Как сосредоточиться на ячейки путем ввода символов в элементе управления datagridview в C#


Я хочу сосредоточиться на ячейке, которая содержит нажатые символы.

Предположим, что datagridview содержит два столбца Name и Address.
Теперь в колонке Name есть много записей, таких как Nims, john, kan, rocks, rita и т. д...

Теперь, если я ввожу символ "К", "А", "Н", то ячейка будет сосредоточена на Кане.

У меня есть google для этого, но я получаю решение, как показано ниже кода, который не удовлетворил мой вопрос.

Потому что это ячейка фокуса, которая содержит нажатый символ в качестве начального символа значения ячейки.

Заранее спасибо.

Что я уже пробовал:

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Char.IsLetter(e.KeyChar))
    {
        for (int i = 0; i < (dataGridView1.Rows.Count); i++)
        {
            if (dataGridView1.Rows[i].Cells["Name"].Value.ToString().StartsWith(e.KeyChar.ToString(), true, CultureInfo.InvariantCulture))
            {
                dataGridView1.Rows[i].Cells[0].Selected = true;
                return; // stop looping
            }
        }
    }
}

2 Ответов

Рейтинг:
2

RickZeeland

Другим вариантом было бы использовать LINQ поиск по подстановочным знакам, вот пример:
C# - поиск по Подстановочным знакам с помощью LINQ[^]


Member Albert

Мне не нужно текстовое поле для поиска данных в datagridview.
Я просто хочу сфокусировать ячейку, которая содержит значение, введенное только в datagridview.

Рейтинг:
16

RickZeeland

Вы можете определить общедоступную переменную для хранения набранных символов и использовать ее в своем dataGridView1_KeyPress(). Для KeyCodes видеть: Перечисление Ключей (System.Окна.Формы)[^]

public string typedChars = string.Empty;

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
    if(e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
    {
        typedChars = string.Empty;
        return;
    }

    if (Char.IsLetter(e.KeyChar))
    {
        typedChars += e.KeyChar.ToString();

        for (int i = 0; i < (dataGridView1.Rows.Count); i++)
        {
            if (dataGridView1.Rows[i].Cells["Name"].Value.ToString().StartsWith(typedChars, true, CultureInfo.InvariantCulture))
            {
                dataGridView1.Rows[i].Cells[0].Selected = true;
                return; // stop looping
            }
        }
    }
}


Member Albert

Спасибо Рикзиленд,
Я хочу сбросить его, когда пользователь нажимает клавиши со стрелками "вверх", "вниз", "влево", "вправо".
Так что же делать?

RickZeeland

Я обновил решение, чтобы сбросить переменную. Еще одна сумасшедшая идея состояла бы в том, чтобы сбросить переменную после периода x секунд отсутствия активности клавиатуры.

Member Albert

Спасибо Братан,
Теперь все ясно.
Я сделал это до того, как вы прокомментировали, но я сделал это, создав индивидуальный метод dataGridView1_KeyDown.
Кстати, сейчас это решилось.
Спасибо снова.