TextChanged хочет, чтобы он проверялся после того, как пользователь ввел дату, но он проверяется, когда пользователь вводит дату

Привет, ребята, это должна быть простая логика для большинства программистов, но я не могу ее понять.

У меня есть 2 datetimepicker в моей форме Windows datetimepicker 1 = fromdate datetimepicker 2 = todate

дату и дату я получаю из приведенного ниже sql

   SELECT MIN(TransDate) AS mindate, MAX(TransDate) AS maxdate 
FROM dbo.EtimePunchDetail WHERE (EmpID = @empid)

fromdate = mindate и todate = maxdate

fromdate.mindate = mindate todate.maxdate = maxdate ("Таким образом, пользователь работает только с выбранным диапазоном дат")

я добавил два текстовых поля с функцией поиска, в которые пользователь может ввести fromdate и todate, и он проверяет соответствие mindate и maxdate, и если пользователь вводит дату вне диапазона, я устанавливаю окно сообщения, чтобы выдать ошибку

У меня изменилось текстовое поле, даже если есть следующий запрос:

      private void Min_TextChanged(object sender, EventArgs e)
        {

              DateTime date = DateTime.Parse(Min.Text);

              if (date < DateTime.Parse(AvailableMin.Text))
               {
                   MessageBox.Show("The Date you entered is either out of range or an invalid format");
                }
              else
                {
                  FromDate.MinDate = date;
                  FromDate.Value = date;
                }
        }
private void Max_TextChanged(object sender, EventArgs e)
    {
         DateTime date = DateTime.Parse(Max.Text);

         if (date > DateTime.Parse(AvailableMax.Text))
         {
            MessageBox.Show("The Date you entered is either out of range or an invalid format");
         }
         else
         {
            ToDate.MaxDate = date;
            ToDate.Value = date;
         }
         }

Но когда я меняю текст, событие textchanged запускается вместе с сообщением и не позволяет мне изменить дату или говорит, что это недопустимая дата. я хочу иметь возможность ввести дату, а затем textchanged должен проверить, не находится ли введенная дата в диапазоне, как я могу это сделать ??

вот визуальное представление того, что я прошу:

введите здесь описание изображения

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

Минимальное и максимальное значение

private void mindateset() // fill the listbox of values of mindate and maxdate
{
if (Employee.SelectedValue != null)
  {
if (Employee.SelectedValue.ToString().Trim().Length > 0)
    {
try
     {
  using (MSSQL.SqlConnection connection = new MSSQL.SqlConnection(constr))
       {
   timepunchnew = new EtimeHistoryDataSet();
    connection.Open();
    using (MSSQL.SqlCommand command = new MSSQL.SqlCommand("SELECT MIN(TransDate) AS mindate, MAX(TransDate) AS maxdate FROM dbo.EtimePunchDetail WHERE (EmpID = @empid)", connection))
    {
   MSSQL.SqlParameter myminparam = new MSSQL.SqlParameter();
   myminparam.Direction = ParameterDirection.Input;
   myminparam.ParameterName = "@empid";
   myminparam.Value = Employee.SelectedValue;
   command.Parameters.Add(myminparam);
   MSSQL.SqlDataAdapter myadapter = new System.Data.SqlClient.SqlDataAdapter();
   myadapter.SelectCommand = command;
   myadapter.Fill(timepunchnew, "Mindate");
   AvailableMin.DataSource = timepunchnew.Mindate;
   AvailableMin.DisplayMember = "mindate";
   AvailableMax.DataSource = timepunchnew.Mindate;
   AvailableMax.DisplayMember = "maxdate";
   FromDate.MinDate = DateTime.Parse(AvailableMin.Text);
   FromDate.Value = FromDate.MinDate;
   ToDate.MaxDate = DateTime.Parse(AvailableMax.Text);
   ToDate.Value = ToDate.MaxDate;
   Min.Text = FromDate.MinDate.ToString("d");
   Max.Text = ToDate.MaxDate.ToString("d");
   }
}
}
catch (Exception) { /*Handle error*/ }

}
}

 }

Проверка значений datetimepicker

private void FromDate_ValueChanged_1(object sender, EventArgs e)
          {
         if (empchanging == false)
         {
          if (FromDate.Value > ToDate.Value)
           {
             // MessageBox.Show("From Date Cannot Be Greater Than To Date");
                 if (DialogResult.OK == MessageBox.Show("From Date Cannot Be Greater Than To Date"))
                 {
                  FromDate.MinDate = DateTime.Parse(AvailableMin.Text);
                  FromDate.Value = FromDate.MinDate;

                }
              }
          }
         }
      private void ToDate_ValueChanged_1(object sender, EventArgs e)
       {
       if (empchanging == false)
       {
       if (ToDate.Value < FromDate.Value)
       {
      //MessageBox.Show("To Date Cannot Be Less Than From Date");
        if (DialogResult.OK == MessageBox.Show("To Date Cannot Be Less Than From Date"))
         {
         ToDate.MaxDate = DateTime.Parse(AvailableMax.Text);
         ToDate.Value = ToDate.MaxDate;
        }
     }
    }
     }

Проверка доступного диапазона дат для пустой строки

private void AvailableMin_SelectedIndexChanged(object sender, EventArgs e)
{
 if (AvailableMin.Text == string.Empty)
  {
   textBox2.Visible = true;
  textBox2.Text = "There is no From Date available for this particular user";

}
else
{
 textBox2.Visible = false;
 }
    }

private void AvailableMax_SelectedIndexChanged(object sender, EventArgs e)
  {
    if (AvailableMax.Text == string.Empty)
    {
      textBox1.Visible = true;
   textBox1.Text = "There is no To Date available for this particular user";
  }
  else
    {
   textBox1.Visible = false;
    }
    }

Я попробовал следующее решение

 private void Min_TextChanged(object sender, EventArgs e)
 {
  DateTime date; 
if (!DateTime.TryParse(Min.Text, out date))
       {
formerrorprovider.SetError(this.Min,"The Date you entered is in invalid format");
  }
   else if (date < DateTime.Parse(AvailableMin.Text))
 {
  formerrorprovider.SetError(this.Min, "The Date you entered is either out of range");
     }
    else 
   {
   formerrorprovider.SetError(this.Min, string.Empty);
    FromDate.MinDate = date;
    FromDate.Value = date;
     }

он принимает дату, которую я ввожу, но мешает проверке средства выбора даты и времени.

введите здесь описание изображенияПОМОЩЬ PLZ


person HackMaster    schedule 16.02.2015    source источник
comment
Вы хотите проверять ввод только тогда, когда пользователь пытается переместить фокус на другой элемент управления, т. е. когда он закончил вводить значение?   -  person HABO    schedule 16.02.2015
comment
@HABO, когда они закончили вводить значение, поэтому, даже когда я удаляю 5 в 2015 году, появляется окно сообщения с сообщением, и если я пытаюсь очистить текстовое поле каждый раз, когда текст изменяется, я получаю строку ошибки не был признан.   -  person HackMaster    schedule 16.02.2015
comment
FWIW, я обычно обнаружил, что удобнее проверять все входные данные, когда пользователь говорит, что они сделаны, например. они нажимают на Run Report. Таким образом, вы не заставите их играть в игру, пытаясь выяснить порядок, в котором они должны менять поля, например. From Date не должно быть позже, чем To Date, но если вы хотите изменить оба, вам может придется сначала изменить From. Они могут копировать и вставлять, корректировать и возиться с содержанием их сердца. Конечно, при вводе данных в штрих-коде сотрудника могут быть запрещены символы, кроме цифр, но это не проверка.   -  person HABO    schedule 17.02.2015
comment
@HABO это именно то, что я сделал, я фактически добавил еще два текстовых поля, которые будут хранить значения текстовых полей, которые вводит пользователь, и сделал видимость ложной, а затем проверил доступные минимальные и максимальные значения после нажатия кнопки.   -  person HackMaster    schedule 17.02.2015


Ответы (2)


как возможное решение пользовательского интерфейса: не показывать MessageBox, если дата недействительна, но добавить элемент управления ErrorProvider в форму и установить описание ошибок в текстовые поля Max и Min. Поставщик ошибок покажет значок ошибки, если есть неверные данные, и скроет его, когда ввод будет приемлемым.

private void Max_TextChanged(object sender, EventArgs e)
{
     DateTime date;

     if (!DateTime.TryParse(Max.Text, out date))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is in invalid format");
     }
     else if (date > DateTime.Parse(AvailableMax.Text))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is out of range");
     }
     else
     {
        formErrorProvider.SetError(this.Max, string.Empty);
        ToDate.MaxDate = date;
        ToDate.Value = date;
     }
}
person ASh    schedule 16.02.2015
comment
Эш, я попробовал ваше решение, но каждый раз, когда я очищаю существующую дату, я получаю, что строка не была распознана как действительная ошибка DateTime. причина ошибки DateTime date = DateTime.Parse(Max.Text); - person HackMaster; 16.02.2015
comment
@HackMaster: хорошо, что вы хотите, чтобы код делал, когда значение было очищено? Вы можете использовать TryParse() вместо Parse(), чтобы поймать случай недопустимого формата; код, который вы используете, всегда будет вызывать исключение, если пользователь вводит что-то, что не поддается разбору, как DateTime. - person Peter Duniho; 16.02.2015
comment
@HackMaster, я в основном использовал твой код. Изменил мой ответ с помощью TryParse - person ASh; 16.02.2015
comment
Эш, я думаю, ты хочешь !DateTime.TryParse(Max.Text, out date) ||... вместо того, что ты опубликовал. - person Peter Duniho; 16.02.2015
comment
@ASh Я добавил другие части кода, я также проверяю дату и дату. а также попробовал ваше решение, теперь оно позволяет мне добавить дату без всплывающего окна сообщения :), но оно не проверяется с помощью datetimepicker :( - person HackMaster; 16.02.2015
comment
@PeterDuniho я знаю, что функциональность text_changed заключается в срабатывании при изменении текста, я просто хочу сравнить дату, которую пользователь вводит в текстовое поле, с диапазоном из средства выбора даты и времени, и вывести окно сообщения с ошибкой, если не просто установить средство выбора даты и времени к значению текстового поля. - person HackMaster; 16.02.2015
comment
@ASH, твое решение сотворило волшебство!! но это мешает моей проверке средства выбора даты и времени, поскольку я устанавливаю его равным средству выбора даты и времени, поскольку я меняю дату, когда я получаю окно сообщения из средства выбора даты и времени. - person HackMaster; 16.02.2015

Ваш код делает именно то, о чем вы просили: он проверяет значение каждый раз, когда текст изменяется.

Если это не то поведение, которое вам нужно, то не делайте этого!

Например, вы можете предпочесть проверить значение на Leave или LostFocus. В качестве альтернативы вы можете использовать существующую модель проверки в классе Control и поместить свою проверку в метод, который является обработчиком событий для Validating (которое возникает между событиями Leave и LostFocus).

Другое предложение представить отзывы пользователей в менее разрушительной форме также является очень хорошим предложением. Это было бы более удобным для пользователя в целом, за счет того, что обратная связь с пользователем будет более тонкой и ее будет легче не заметить.

person Peter Duniho    schedule 16.02.2015
comment
В дополнение к событию потери фокуса, вызывающему проверку, вы также можете использовать событие изменения текста для запуска (или перезапуска) короткого (скажем, 3 секунды) таймера, который, когда он в конечном итоге истечет после того, как пользователь перестанет печатать, вызовет функция проверки. Таким образом, пользователю не нужно переходить или нажимать на другой элемент управления, чтобы проверить содержимое элемента с текущим фокусом. Продолжительность таймера должна быть балансом между тем, чтобы быть настолько коротким, что ваша проблема все еще возникает, и настолько длинным, чтобы пользователь чувствовал себя вынужденным щелкнуть или перейти к другому элементу управления, чтобы принудительно выполнить проверку. - person RobH; 17.02.2015