Member 13750004 Ответов: 1

Установите фокус на текстовое поле /combobox в winforms, если оно пустое


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

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

//protected override bool ProcessTabKey(bool forward)
       //{
       //    Control ctl = this.ActiveControl;
       //    if (ctl != null && ctl is ComboBox)
       //    {
       //        ComboBox cb = (ComboBox)ctl;
       //        if (cb.Text.Length == 0)
       //            return true;
       //    }
       //    if (ctl != null && ctl is TextBox)
       //    {
       //        if (txtDocumentNo.Text.Length == 0)
       //            return true;
       //    }
       //    return base.ProcessTabKey(forward); // process TAB key as normal
       //}

Richard MacCutchan

Этот код даже не будет компилироваться, так как все это закомментировано. Попробуйте скомпилировать его, а затем объясните, что происходит при запуске приложения.

Member 13750004

Да, это работает, но это не может работать для щелчка мыши, если я нажимаю на любой другой элемент управления, который выбирается щелчком мыши

Richard MacCutchan

Вам нужно показать код и объяснить, что именно происходит.

[no name]

Если этот код работает, пробовали ли вы вызывать этот метод для событий мыши?

j snooze

почему бы вам не сделать то, что вы делаете с полем со списком в текстовом поле? Разве вы не предпочли бы иметь его
Textbox tx = (текстовое поле)ctl;
if (tx.Text.Length == 0)....

Почему у вас есть конкретное имя текстового поля?

BillWoodruff

Вам нужно описать свою цель более подробно.

1 Ответов

Рейтинг:
4

Maciej Los

Если вы говорите о проверке данных, вы можете использовать Класс ErrorProvider (System.Окна.Формы) | Microsoft Docs[^]

Для получения более подробной информации, пожалуйста, смотрите: Как отобразить значки ошибок для проверки формы с помощью компонента Windows Forms ErrorProvider | Microsoft Docs[^]

Примечание: если существует набор различных правил для каждой проверки, я бы создал словарь ErrorProviders для каждого элемента управления, который вы хотите проверить. Например, если вам нужно проверить, является ли введенное значение числом, вам нужно создать "NumberErrorProvider", если вы хотите проверить, является ли телефон нет. действительно, создайте "PhoneNoErrorProvider" и т. д...
Наконец, вы можете создать пользовательский метод (например: IsFormValid) , который проходит через коллекцию ErrorProviders и возвращает true/false.

public partial class Form1 : Form
{
    private Dictionary<Control, ErrorProvider> validators = new Dictionary<Control, ErrorProvider>();

    public Form1()
    {
        InitializeComponent();

        validators.Add(textBox1, new ErrorProvider(this){//other properties here});
        validators.Add(comboBox1, new ErrorProvider(this){//...});
    }


    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (IsValidNumber(textBox1.Text)) //to do: add IsValidNumber method
            validators[textBox1].SetError(textBox1, "Field 'Number' has to be a valid number!");
        else
            validators[textBox1].Clear();
    }

    //other code here....

    private bool IsFormValid()
    {
        foreach (Control c in validators.Keys)
        {
            if(validators[c].GetError(c) !="")
                return false;
        }
        return true;
    }

}


Это основная концепция валидации данных WinForms. Вы можете реализовать свой собственный.

Удачи вам!


Member 13750004

спасибо

Maciej Los

Всегда пожалуйста.