Вопрос по c#, keystroke, forwarding – Отправить нажатие клавиши на другой элемент управления

9

Легкий для вас, ребята.

У меня есть текстовое поле в верхней части списка.

Текстовое поле используется для фильтрации данных в списке.

Итак ... Когда пользователь вводит текстовое поле, я хотел бы "ловушка» нажатия клавиш up / up / pagedown / pageup и перенаправления их в список.

Я знаю, что могу использовать Win32 API и отправить сообщение WM_KeyDown. Но там'Это должен быть какой-то .NET способ сделать это.

Ваш Ответ

4   ответа
12

Метод SendKeys.Send ().

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            listBox1.Focus();
            SendKeys.Send(e.KeyChar.ToString());
        }

Вот код, с помощью которого вы можете выбрать элемент списка.

private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            textBox1.AutoCompleteSource=AutoCompleteSource.CustomSource;
            string[] ar = (string[])(listBox1.Items.Cast()).ToArray();
            textBox1.AutoCompleteCustomSource.AddRange(ar);
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Text  = textBox1.Text;
        }
И если я хочу, чтобы фокус оставался в текстовом поле, я делаю textbox.focus () сразу после? Странно, что sendkey ненет перегрузки, чтобы передать ему контроль ... vIceBerg
Как мне сказать SendKeys.Send отправить нажатие клавиши в элемент управления списка? vIceBerg
1
    private void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
        {
            // Setting e.IsInputKey to true will allow the KeyDown event to trigger.
            // See "Remarks" at https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown(v=vs.110).aspx
            e.IsInputKey = true;
        }
    }

    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        string send = "";
        if (e.KeyCode == Keys.PageUp)
        {
            send = "PGUP";
        }
        else if (e.KeyCode == Keys.PageDown)
        {
            send = "PGDN";
        }
        else if (e.KeyCode == Keys.Up)
        {
            send = "UP";
        }
        else if (e.KeyCode == Keys.Down)
        {
            send = "DOWN";
        }
        if (send != "")
        {
            // We must focus the control we want to send keys to and use braces for special keys.
            // For a list of all special keys, see https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx.
            listBox.Focus();
            SendKeys.SendWait("{" + send + "}");
            textBox.Focus();
            // We must mark the key down event as being handled if we don't want the sent navigation keys to apply to this control also.
            e.Handled = true;
        }
    }
1

Вы можете использовать привязку данных

            listBox1.DataBindings.Add("DataSource", textBox1, "Text", true, DataSourceUpdateMode.OnPropertyChanged).
            Format += (sender, e) =>
            {
                e.Value = _strings.FindAll(s => s.StartsWith((string) e.Value));
            };
Нет, для фильтрации данных в списке. Если вы связываете свойство Text текстового поля со свойством DataSource списка и используете DataSourceUpdateMode.OnPropertyChanged, вы можете достичь этого. Jacob Seleznev
Вам нужно как-то отфильтровать содержимое списка в событии Format для привязки. Jacob Seleznev
Привязка данных для отправки нажатия клавиши на другой элемент управления vIceBerg
Спасибо за чаевые vIceBerg
Ох ... я думаю, что могусделать это Поскольку элементы списка уже заполнены списком <> привязано к свойству источника данных ... vIceBerg
0

В нашем wpf-приложении у нас есть текстовое поле, которое фильтрует список, мы используем событие previewkeyup. Внутри кода мы можем проверить, какая клавиша была нажата (непередо мной мой код,что-то вроде e.Key == Key.UpArrow, так или иначеЭто встроенный класс в C # для этого). Если оно's одна из горячих клавиш, мы манипулируем пользовательским контролем соответственно.

Для списка мы добавили его в пользовательский элемент управления и реализовали интерфейс, называемый NavigateableListbox или что-то в этом роде, заставив его реализовать MoveUp (), MoveDown (), PageUp (), PageDown () и т. Д., Так что событие textbox просто говорит, что если e.Key = Key.UpArrow {mylistbox.MoveUp ()}

Похожие вопросы