2015-02-16 2 views
0

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

У меня есть 2 DateTimePicker на моей форме окна DateTimePicker 1 = FromDate DateTimePicker 2 = ФОРУМЕ

От даты и до настоящего времени я получаю от ниже 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 должен проверить, не указана ли введенная дата, как я могу это сделать?

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

enter image description here

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

Min и Max Value

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; 
    } 

принимает дату ввода, но вмешивается в проверку валидатора datetimepicker.

enter image description here PLZ HELP

+0

Вы хотите проверить ввод только тогда, когда пользователь пытается переместить фокус на другой элемент управления, то есть когда они закончили вводить значение? – HABO

+0

@HABO, когда они закончили вводить значение, поэтому даже когда я удаляю 5 в 2015 году, окно сообщения появляется с сообщением, и если я пытаюсь очистить текстовое поле каждый раз, когда текст изменится, я получу ошибку строка не была распознана. – HackMaster

+1

FWIW, я обычно обнаружил, что более дружелюбно проверять все входные данные, когда пользователь говорит, что они сделаны, например. они нажимают «Запустить отчет». Таким образом, у вас нет этих игр, чтобы попытаться выяснить порядок, в котором они должны изменять поля, например. 'From Date' должен быть не позже, чем' To Date', но если вы хотите изменить оба, то вы можете _have_ сменить сначала. Они могут вырезать пасту, приспосабливаться и поглаживать свое сердце. Конечно, вы можете не допускать символы, отличные от цифр в штрих-коде Employee во время ввода данных, но это не проверка. – HABO

ответ

2

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

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; 
    } 
} 
+0

Ash Я попробовал ваше решение, но каждый раз, когда я очищаю существующую дату, я получаю, что String не была признана допустимой ошибкой DateTime. причиной ошибки является DateTime date = DateTime.Parse (Max.Text); – HackMaster

+1

@HackMaster: ну, что вы хотите, чтобы код выполнял, когда значение было очищено? Вы можете использовать 'TryParse()' вместо 'Parse()', чтобы поймать случай «недопустимый формат»; код, который вы используете, всегда будет генерировать исключение, если пользователь вводит что-то не анализируемое как 'DateTime'. –

+0

@HackMaster, я использовал ваш код в основном. Модифицированный мой ответ с TryParse – ASh

2

Ваш код делает именно то, что вы просили его сделать: это проверка значения в любое время текст изменился ,

Если это не то поведение, которое вы хотите, то не делайте этого!

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

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

+0

В дополнение к тесту потерять фокус, вызывающему проверку, текстовое изменение, чтобы запустить (или перезапустить) короткий (скажем, 3 секунды) таймер, который, когда он в конце концов истечет после того, как пользователь перестанет печатать, вызовет функцию проверки. Таким образом, пользователю не нужно вводить вкладку или щелкнуть по другому элементу управления, чтобы иметь содержимое с подтверждением текущего фокуса. Продолжительность таймера должна быть балансом между тем, чтобы быть настолько коротким, что ваша проблема все еще случается и так долго, что пользователь чувствует себя вынужденным щелкнуть или перейти к другому элементу управления, чтобы принудительно выполнить проверку. – RobH

Смежные вопросы