Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ограничение на вводимые значения в DataGridView при помощи обработчика нажатия клавиши

85K
18 апреля 2013 года
Black_Howk
6 / / 18.02.2013
Добрый день!

Помогите, пожалуйста, разобраться с ограничением на вводимые в ячейку DataGridView при использовании C++. Необходимо, чтобы в ячейку можно было ввести только значения 0 или 1.
Пытаюсь решить это через обработчики события нажатия клавиши. Отыскала, как подобная проблема решалась на C#, попыталась напрямую "перевести" на C++, в итоге ожидаемо получила ошибку об отсутствии списка аргументов у функции и предложение создать ссылку на функцию.


Код:
private: System::Void dataGridView1_EditingControlShowing(System::Object^  sender, System::Windows::Forms::DataGridViewEditingControlShowingEventArgs^  e) {
                 //здесь возникает ошибка, связанная с отсутствием аргументов у функции
                 e->Control->KeyPress += gcnew KeyPressEventHandler(dataGridView1_KeyPress);
             }

private: System::Void dataGridView1_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
                 if (e->KeyChar != '0' || e->KeyChar != '1')
                 {
                     e->Handled = true;
                 }
             }

Если пытаюсь вместо самой функции assess_KeyPress использовать указатель на нее, то получаю ошибку :
error C3352: void trydgv::Form1::dataGridView1_KeyPress(System::Object ^,System::Windows::Forms::KeyPressEventArgs ^): указанная функция не соответствует типу делегата "void (System::Object ^,System::Windows::Forms::KeyPressEventArgs ^)"

Уже со всех сторон пыталась решить и созданием объекта и ссылкой на него. Помогите, пожалуйста, понять, как все же правильно использовать здесь функцию-обработчик или ссылку на нее.
Заранее спасибо!
327
23 апреля 2013 года
UserNet2008
748 / / 03.04.2010
~Вот на скорую руку и в этом коде могут быть и ляпы!!!

В этом примере ввод "0 и 1" только для Column2


Код:
private:
  bool nonNumberEntered;

private: System::Void dataGridView1_EditingControlShowing(System::Object^  sender, System::Windows::Forms::DataGridViewEditingControlShowingEventArgs^  e) {
                 
    if ( this->dataGridView1->CurrentCell->OwningColumn->Name->Equals(L"Column2"))
        {
            e->Control->KeyPress -= gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::Control_KeyPress);
            e->Control->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::Control_KeyPress);
        }
    else
        {
            e->Control->KeyPress -= gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::Control_KeyPress);
        }
            }
void Control_KeyPress(System::Object^ /*sender*/, System::Windows::Forms::KeyPressEventArgs^ e){
// Initialize the flag to false.
  nonNumberEntered = false;

// Determine whether the keystroke is a number from the top of the keyboard.
  if ( e->KeyChar < 48 || e->KeyChar > 49 )
    {
     // Determine whether the keystroke is a number from the keypad.
            if ( e->KeyChar < 98 || e->KeyChar > 97)
       {
     // Determine whether the keystroke is a backspace.
            if ( e->KeyChar != 8 )
       {
     // A non-numerical keystroke was pressed.
     // Set the flag to true and evaluate in KeyPress event.
         nonNumberEntered = true;
       }
       }
        }

        // Check for the flag being set in the KeyDown event.
     if ( nonNumberEntered == true )
      { // Stop the character from being entered into the control since it is non-numerical.
         e->Handled = true;
      }
                   
    //If shift key was pressed, it's not a number.
     if (Control::ModifierKeys == Keys::Shift) {
         nonNumberEntered = true;
            }      
}

private: System::Void dataGridView1_CellClick(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e) {
    try{

        this->label1->Text=L"Столбец :"+ dataGridView1->Columns[e->ColumnIndex]->Index.ToString();
        this->label2->Text=L"Строка    :"+ dataGridView1->Rows[e->RowIndex]->Index.ToString();
        this->label3->Text=L"Имя столбца :"+ dataGridView1->Columns[ e->ColumnIndex ]->Name;
    }
    catch(...)
    {}

                 }
327
18 апреля 2013 года
UserNet2008
748 / / 03.04.2010
см. пример


 
Код:
if ( e->KeyCode < Keys::D0 || e->KeyCode > Keys::D9 )
Правильно будет делать событие KeyPress не на DataGridView, а на ячейки таблицы т.к не все ячейки имеют одинаковые параметры ВВОДА.
85K
19 апреля 2013 года
Black_Howk
6 / / 18.02.2013
Спасибо за ответ!

Знакомилась с этим примером, чтобы ограничить вводимые значения в TextBox. Там все работало без вопросов:)
В DataGridView почему-то при редактировании ячейки нажатие клавиши за таковое не принимается, что подтвердилось при отладке. Если на том же DataGridView переходить между ячейками путем нажатия клавиш влево-вправо, вверх-вниз - их он обрабатывает как нажатие клавиши и вполне корректно загружает обработчики KeyDown или KeyPress, но вот при нажатии клавиш с символьными значениями, DataGridView сразу переходит в режим редактирования и обработчик нажатия клавиши не запускает.

Смотрела, как решается данная проблема здесь и здесь но вот под С++ переделать не удалось корректно.

Не знаю, как повесить событие на ячейку, тем более что ячейки определяются только в момент построения формы (то есть при проектировании формы еще не определено, сколько столбцов и строк, эти параметры задаются пользователем).

Можно, конечно, решить эту задачу путем проверки уже введенного значения и стиранием его, если это не 1 или 0, но хочется разобраться, как можно именно запретить ввод.
327
21 апреля 2013 года
UserNet2008
748 / / 03.04.2010
Всё правильно Вы применяете событие KeyPress на DataGridView, а DataGridView имеет таблицу,а таблица имеет ячейки. Я уже писал:
Цитата:
Правильно будет делать событие KeyPress не на DataGridView, а на ячейки таблицы т.к не все ячейки имеют одинаковые параметры ВВОДА.


Как вариант


 
Код:
private: System::Void dataGridView1_CellClick(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e) {

//if ( this->dataGridView1->Columns[ e->ColumnIndex ]->Name->Equals( "Column2" ));
{
Теперь мы видим, что аргумент e = 0x0257cde8 { columnIndex=1 rowIndex=0 }
Осталось только отфильтровать ввод с клавы.
85K
23 апреля 2013 года
Black_Howk
6 / / 18.02.2013
Спасибо за пояснение! Но у меня все же не выходит применить KeyPress к ячейке. Небольшой опыт еще в программировании, может чего-то простого не замечаю.
Попробовала в событие CellClick (хотя оно и срабатывает только на щелчок мыши) вставить примерно такой код - посмотреть, скомпилируется или нет

 
Код:
dataGridView1->Rows[e->RowIndex]->Cells[e->ColumnIndex]->KeyPress += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::dataGridView1_KeyDown);
Вроде здесь получаю как раз нужную ячейку, к которой пытаюсь подключить KeyPress.
Получаю ошибку: error C2039: KeyPress: не является членом "System::Windows::Forms::DataGridViewCell"

Если пытаюсь прицепить к самому аргументу e

 
Код:
e->KeyPress += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::dataGridView1_KeyDown);
Ожидаемо появляется та же ошибка.
И в инициализации компонентов тоже не объявить, так как для класса ячейки, по-видимому, не существует обработчика нажатия кнопки.

Попробую еще использовать KeyEntersEditMode с передачей значения нажаттой кнопки сразу в таблицу. Но это все же несколько не то.
85K
25 апреля 2013 года
Black_Howk
6 / / 18.02.2013
Огромное спасибо!

Вот эта инициализация функции как раз то, чего не хватало для понимания с самого начала

 
Код:
e->Control->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::Control_KeyPress);
Теперь все должно заработать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог