Проверьте Control.Value для данных

У меня есть несколько различных элементов управления (TextBoxes, DateTimePickers, MaskedTextBoxes) в форме, которую я хотел бы проверить, чтобы увидеть, содержат ли они какие-либо данные. У меня есть следующий код в событии Click моей кнопки "Сохранить":

    private void radBtnSave_Click(object sender, EventArgs e)
    {
        this.Cancelled = false;
        bool bValid = true;

        foreach(Control control in this.Controls)
        {
            if (control.Tag == "Required")
            {
                if (control.Text == "" || control.Text == null)
                {
                    errorProvider.SetError(control, "* Required Field");
                    bValid = false;
                }
                else
                {
                    errorProvider.SetError(control, "");
                }
            }
        }

        if (bValid == true)
        {
            bool bSaved = A133.SaveData();
            if (bSaved != true)
            {
                MessageBox.Show("Error saving record");
            }
            else
            {
                MessageBox.Show("Data saved successfully!");
            }
        }
    }

Это отлично работает для TextBoxes и MaskedEditBoxes, однако не работает для DateTimePickers. Для них я знаю, что мне нужно проверить свойство.Value, но я не могу получить к нему доступ из объекта Control (то есть "control.Value == "" || control.Value == null").

Я что-то упускаю из виду? Будем весьма благодарны за любые предложения о внесении изменений в этот код, которые позволят мне проверить значения DateTimePicker (или просто улучшить код).

3 ответа

Решение

Вам необходимо привести их к DateTimePicker:

DateTimePicker dtp = control as DateTimePicker;
if(dtp !=null)
{
   //here you can access dtp.Value;
}

Также, используйте String.IsNullOrEmpty(control.Text) в первой части вашего кода.

Здесь нет Value собственность для Controls; DateTimePickerНапример, создает свое собственное свойство, уникальное для него.

К сожалению для вас, не существует полностью универсального способа справиться с этим из одного цикла Control объекты. Лучшее, что вы можете сделать, это что-то вроде этого:

if(control is DateTimePicker)
{
   var picker = control as DateTimePicker;
   // handle DateTimePicker specific validation. 
}

Вам нужно будет сделать что-то вроде этого:

foreach(Control control in this.Controls)
{
    if (control.Tag == "Required")
    {
        DateTimePicker dtp = control as DateTimePicker;
        if (dtp != null)
        {
            // use dtp properties.
        }
        else if (control.Text == "" || control.Text == null)
        {
            errorProvider.SetError(control, "* Required Field");
            bValid = false;
        }
        else
        {
            errorProvider.SetError(control, "");
        }
    }
}
Другие вопросы по тегам