2016-01-06 4 views
0

Добрый день, каждый может помочь мне с этой проблемой ... У меня есть поле со списком и текстовое поле. текстовое поле (txtFruitNo) проверит длину текста под событием Leave. Все хорошо. Но если я нажму на поле со списком, а txtFruitNo еще не закончен. Мне нужно, чтобы я закончил сначала длину txtFruitNo, тогда только я могу щелкнуть поле со списком.messagebox всегда всплывает при нажатии комбинированной ячейки

Я не хочу показывать окно сообщений, если я нажимаю на поле со списком, даже если длина txtFruitNo еще не завершена.

Благодаря

private void cmbFruitSelection_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DateTime thetime = DateTime.Now; 
     String varApple = "App-Red"; 
     String varBanana = "Ban-Yellow"; 

     if (cmbFruitSelection.SelectedItem.ToString() == "Apple") 
     { 
      txtFruitNo.Text = varApple.ToString() + thetime.ToString("yyyy"); 
      txtFruitNo.SelectionStart = txtFruitNo.Text.Length; 
      txtFruitNo.MaxLength = 18; 

     } 
     else if (cmbFruitSelection.SelectedItem.ToString() == "Banana") 
     { 
      txtFruitNo.Text = varBanana.ToString() + thetime.ToString("yyyy"); 
      txtFruitNo.SelectionStart = txtFruitNo.Text.Length; 
      txtFruitNo.MaxLength = 17; 

     } 
    } 

    private void txtFruitNo_Leave(object sender, EventArgs e) 
    { 
     if (txtFruitNo.TextLength != txtFruitNo.MaxLength) 
     { 
      MessageBox.Show("Your fruit number is too short. Please check."); 
      txtFruitNo.Focus(); 
     } 
     else 
     { 
      // Do something here 
     } 
    } 
+0

Вы смогли бы достичь желаемого путем введения настраиваемое свойство, указывающее, что был нажат Combo. И проверьте, если пользовательский 'property = true' перед запросом сообщения. – fujiFX

+0

@fujiFX. у вас есть код там .... это действительно помогает – jLaw

+1

Вместо этого используйте событие Validating. Вы можете установить e.Cancel = true, чтобы пользователь не мог изменить фокус. Используйте ErrorProvider, чтобы избежать пощечины пользователя с помощью окна сообщения. –

ответ

0

В какой момент это важно для продолжения программы, что «Fruit Number» находится в пределах параметров. Если это не во время ухода из фокуса, попробуйте переместить его на другой элемент управления, например, кнопка «ОК» может запустить проверку параметров, и если действительный продолжается, если нет флажка, а затем вернуться в текстовое поле

0

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

Введем переменную формы

private bool isComboClicked = false; 

Добавьте ниже строку cmbFruitSelection_SelectedIndexChanged

isComboClicked = true; 

Добавление выше линии в начале указанного выше случае будет запрашивать сообщение проверки длины по выбору значения из комбо. Если вы хотите запросить сообщение для определенного значения в комбо, переместите его в операторы if if (comboBox1.SelectedItem.ToString() == "Apple") и т. Д.

Теперь в txtFruitNo_Leave событие включает код в нижеприведенном состоянии.

if (isComboClicked) 
{ 
    // Your Code 
    if (txtFruitNo.TextLength != txtFruitNo.MaxLength) 
      { 
       MessageBox.Show("Your fruit number is too short. Please check."); 
       txtFruitNo.Focus(); 
      } 
      else 
      { 
       // Do something here 
      } 
} 
+0

To Down избиратель: оцените, если оставить комментарий с причиной, по которой проголосовали. Это поможет мне улучшить этот/будущий ответ (ы). – fujiFX

+0

Я нисходящий, обработчик событий 'txtFruitNo_Leave' никогда не будет проверять текст, потому что' isComboClicked' будет всегда false, пока пользователь не изменит индекс. Рассмотрим случай, когда пользователь сначала вводит текст в TextBox, затем в неполном тексте будет пытаться установить допустимый текст через элемент управления ComboBox. – Fabio

+0

@Fabio, спасибо за отзыв. Но разве это не то, что хочет? Может быть, так оно и было понято, когда прочитал его описание. – fujiFX

0

Как я понимаю:
У вас есть «подтверждение» на TextBox в Leave EventHandler, которые показывают сообщение об ошибке, если проверка не пройдена.
Но если TextBox.Leave событие было поднято выбором ComboBox, то проверка должна быть подавлена.

Создайте Panel и поставьте только txtFruitNo и cmbFruitSelection элементы управления.

// Validation function 
private bool IsTextBoxValid() 
{ 
    return this.txtFruitNo.Length == this.txtFruitNo.maxlength; 
} 

Затем создать и подключить Validating EventHandler для Panel, где вы будете проверять txtFruitNo

private void Panel_Validating(Object sender, CancelEventArgs e) 
{ 
    if(this.IsTextBoxValid() == false) 
    { 
     e.Cancel = true; 
     MessageBox.Show("Your fruit number is too short. Please check.") ;   
    } 
} 

Validating будет поднят только тогда, когда фокус перемещения за пределы панели.
Использование Validating события позволит предотвратить переориентацию для внешних элементов управления автоматически, если e.Cancel = true
В этом случае выпадающего списке cmbFruitSelection может быть сфокусирован и пользователь может завершить txtFruitNo текст, выбрав правильное значение из ComboBox.

Я думаю, что использование ErrorProvider будет более удобным для пользователя, а затем MessageBox.
Добавить ErrorProvider контроль в Form через дизайнер и добавить несколько строк в коде

private void Panel_Validating(Object sender, CancelEventArgs e) 
{ 
    if(this.IsTextBoxValid() == false) 
    { 
     e.Cancel = true; 
     this.ErrorProvider1.SetError(txtFruitNo, 
            "Your fruit number is too short. Please check."); 
    } 
    else 
    { 
     this.ErrorProvider1.Clear(); 
    } 
}  

И очевидном заблуждении после того, как допустимое значение было использовано от ComboBox

private void cmbFruitSelection_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    DateTime thetime = DateTime.Now; 
    String varApple = "App-Red"; 
    String varBanana = "Ban-Yellow"; 

    if (cmbFruitSelection.SelectedItem.ToString() == "Apple") 
    { 
     txtFruitNo.Text = varApple.ToString() + thetime.ToString("yyyy"); 
     txtFruitNo.SelectionStart = txtFruitNo.Text.Length; 
     txtFruitNo.MaxLength = 18; 
     //Clear error 
     this.ErrorProvider1.Clear(); 
    } 
    else if (cmbFruitSelection.SelectedItem.ToString() == "Banana") 
    { 
     txtFruitNo.Text = varBanana.ToString() + thetime.ToString("yyyy"); 
     txtFruitNo.SelectionStart = txtFruitNo.Text.Length; 
     txtFruitNo.MaxLength = 17; 
     //Clear error 
     this.ErrorProvider1.Clear();    
    } 
} 
Смежные вопросы