Ввод только конкретных чисел в DataGridView

ShINkoz

Здравствуйте, Мне в таблице datagridview необходимо, чтобы пользователь мог вводить только числа -1, 0 и 1. Как мне это реализовать? Заранее спасибо.
1 ответ

ShINkoz

Проверка значений происходит в момент ввода. Сложно, но красиво=)
             Control ^_editControl; //переменная под элемент управления редактирования ячейки
 
private: System::Void dataGridView2_EditingControlShowing(System::Object^  sender, System::Windows::Forms::DataGridViewEditingControlShowingEventArgs^  e) 
{
             _editControl = e->Control;
             _editControl->KeyPress += gcnew KeyPressEventHandler(this, &MyForm::EditingControl_KeyPress); //подпись на событие ввода значений с клавиатуры
}
 
private: System::Void dataGridView2_CellEndEdit(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e)
{
 
             //Может пригодится. Проверка на неверное значение на этапе закрытия элемента управления редактирования. Есть 1 минус - вставка при помощи комбинации CTRL+V может обойти этот этап
             //String ^s = _editControl->Text;
 
             //if (_editControl->Text == L"-")
             // ((DataGridView^)sender)[e->RowIndex, e->ColumnIndex]->Value = String::Empty; //удаление значения, если введено только "-"
 
 
             _editControl->KeyPress -= gcnew KeyPressEventHandler(this, &MyForm::EditingControl_KeyPress);
}
 
 
private: System::Void EditingControl_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e)
{
             Char c = e->KeyChar;
 
             if (Char::IsControl(c)) //пропуск команд управления (backspace)
             {
                 return;
             }
 
             if (c == L'-' || c == L'1' || c == L'0')
             {
                 String ^s = _editControl->Text + c;
 
                 if (s == L"-1" || s == L"1" || s == L"0" || s == L"-")
                     return;
                 else
                     e->Handled = true;
             }
             else
                 e->Handled = true;
}
 
private: System::Void dataGridView2_CellValueChanged(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e) //окончательная проверка значения
{
             if (e->RowIndex == -1 || e->ColumnIndex == -1) //на этапе инициализации DGV происходит вызов, который присваивает значения в заголовочные ячейки строк и колонок
                 return;
 
             DataGridViewCell ^cell = ((DataGridView^)sender)[e->RowIndex, e->ColumnIndex];
 
             if (cell->Value == nullptr) //тонкости. Бывает пустое значение возвращает NULL
                 return;
 
             String ^s = (String^)cell->Value;
 
             if (!(s == L"-1" || s == L"1" || s == L"0" || s == L"-"))
                 cell->Value = String::Empty;
}