C# - Столбец DatePicker (WPF DataGrid) не регистрирует событие «строка изменена» для обновления базы данных - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь изменить столбец в моей DataGrid на DatePicker, чтобы иметь возможность выбирать дату из календаря, однако у меня возникает проблема: когда выбирается дата и я меняю строки, она не запускает событие обновить базу данных.

Вот некоторый код:

Создание столбца как DatePicker:

templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Date";
FrameworkElementFactory datePickerFactoryElem = new FrameworkElementFactory(typeof(DatePicker));
templateColumnBinding = new Binding("date_time");
templateColumnBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
templateColumnBinding.Mode = BindingMode.TwoWay;
datePickerFactoryElem.SetValue(DatePicker.SelectedDateProperty, templateColumnBinding);
datePickerFactoryElem.SetValue(DatePicker.DisplayDateProperty, templateColumnBinding);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = datePickerFactoryElem;
templateColumn.CellTemplate = cellTemplate;
DataGrid_training_dataEntry.Columns.Add(templateColumn);

Триггер 1 (обнаружение обновления строки):

private void DataGrid_training_dataEntry_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    DataRowView rowView = e.Row.Item as DataRowView;
    rowBeingEdited_DataGrid_training_dataEntry = rowView;
}

Событие 2 (вставка измененной строки):

private void DataGrid_training_dataEntry_CurrentCellChanged(object sender, EventArgs e)
{
    if (rowBeingEdited_DataGrid_training_dataEntry != null)
    {
        DataGrid_training_dataEntry.CommitEdit();

        MySqlCommand cmdInsert;
        MySqlCommand cmdUpdate;
        cmdUpdate = new MySqlCommand("UPDATE training SET id_training=@id_training,id_type=@id_type,id_value_0001=@id_value_0001,id_value_0002=@id_value_0002,id_value_0003=@id_value_0003,id_value_0004=@id_value_0004,id_value_0005=@id_value_0005,value_value_0001=@value_value_0001,value_value_0002=@value_value_0002,value_value_0003=@value_value_0003,value_value_0004=@value_value_0004,value_value_0005=@value_value_0005,date_time=@date_time,duration=@duration where id_training=@id_training", conn);
        cmdUpdate.Parameters.Add("@id_training", MySqlDbType.LongText, 15, "id_training");
        cmdUpdate.Parameters.Add("@id_type", MySqlDbType.LongText, 15, "id_type");
        cmdUpdate.Parameters.Add("@id_value_0001", MySqlDbType.LongText, 15, "id_value_0001");
        cmdUpdate.Parameters.Add("@id_value_0002", MySqlDbType.LongText, 15, "id_value_0002");
        cmdUpdate.Parameters.Add("@id_value_0003", MySqlDbType.LongText, 15, "id_value_0003");
        cmdUpdate.Parameters.Add("@id_value_0004", MySqlDbType.LongText, 15, "id_value_0004");
        cmdUpdate.Parameters.Add("@id_value_0005", MySqlDbType.LongText, 15, "id_value_0005");
        cmdUpdate.Parameters.Add("@value_value_0001", MySqlDbType.LongText, 15, "value_value_0001");
        cmdUpdate.Parameters.Add("@value_value_0002", MySqlDbType.LongText, 15, "value_value_0002");
        cmdUpdate.Parameters.Add("@value_value_0003", MySqlDbType.LongText, 15, "value_value_0003");
        cmdUpdate.Parameters.Add("@value_value_0004", MySqlDbType.LongText, 15, "value_value_0004");
        cmdUpdate.Parameters.Add("@value_value_0005", MySqlDbType.LongText, 15, "value_value_0005");
        cmdUpdate.Parameters.Add("@date_time", MySqlDbType.DateTime, 15, "date_time");
        cmdUpdate.Parameters.Add("@duration", MySqlDbType.LongText, 15, "duration");
        cmdInsert = new MySqlCommand("INSERT INTO training (id_type,id_value_0001,id_value_0002,id_value_0003,id_value_0004,id_value_0005,value_value_0001,value_value_0002,value_value_0003,value_value_0004,value_value_0005,date_time,duration) VALUES (@id_type,2,id_value_0001,id_value_0002,@id_value_0003,@id_value_0004,id_value_0005,@value_value_0001,@value_value_0002,@value_value_0003,@value_value_0004,@value_value_0005,@date_time,@duration)", conn);
        cmdInsert.Parameters.Add("@id_type", MySqlDbType.LongText, 15, "id_type");
        cmdInsert.Parameters.Add("@id_value_0001", MySqlDbType.LongText, 15, "id_value_0001");
        cmdInsert.Parameters.Add("@id_value_0002", MySqlDbType.LongText, 15, "id_value_0002");
        cmdInsert.Parameters.Add("@id_value_0003", MySqlDbType.LongText, 15, "id_value_0003");
        cmdInsert.Parameters.Add("@id_value_0004", MySqlDbType.LongText, 15, "id_value_0004");
        cmdInsert.Parameters.Add("@id_value_0005", MySqlDbType.LongText, 15, "id_value_0005");
        cmdInsert.Parameters.Add("@value_value_0001", MySqlDbType.LongText, 15, "value_value_0001");
        cmdInsert.Parameters.Add("@value_value_0002", MySqlDbType.LongText, 15, "value_value_0002");
        cmdInsert.Parameters.Add("@value_value_0003", MySqlDbType.LongText, 15, "value_value_0003");
        cmdInsert.Parameters.Add("@value_value_0004", MySqlDbType.LongText, 15, "value_value_0004");
        cmdInsert.Parameters.Add("@value_value_0005", MySqlDbType.LongText, 15, "value_value_0005");
        cmdInsert.Parameters.Add("@date_time", MySqlDbType.DateTime, 15, "date_time");
        cmdInsert.Parameters.Add("@duration", MySqlDbType.LongText, 15, "duration");
        mySqlDataAdapter.InsertCommand = cmdInsert;
        mySqlDataAdapter.UpdateCommand = cmdUpdate;

        mySqlDataAdapter.Update(dataSet_training_dataEntry);
        conn.Close();
        conn.Dispose();

        DataGrid_training_dataEntry.ItemsSource = null;
        dataSet_training_dataEntry.Reset();

        rowBeingEdited_DataGrid_training_dataEntry.EndEdit();

        rowBeingEdited_DataGrid_training_dataEntry = null;

        conn = new MySqlConnection(connStr);
        mySqlDataAdapter = new MySqlDataAdapter("select * from training", conn);
        command = conn.CreateCommand();
        conn.Open();

        mySqlDataAdapter.Fill(dataSet_training_dataEntry);
        DataGrid_training_dataEntry.ItemsSource = dataSet_training_dataEntry.Tables[0].DefaultView;
        conn.Close();
        conn.Dispose();
        DataGrid_training_dataEntry.Columns[1].IsReadOnly = false;
    }
}

Событие 3 (регистрация изменения ячейки в качестве обновления строки):

 private void DataGrid_training_dataEntry_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
 {
     if (!isManualEditCommit)
     {
         isManualEditCommit = true;
         DataGrid grid = (DataGrid)sender;
         grid.CommitEdit(DataGridEditingUnit.Row, true);
         isManualEditCommit = false;
     }
 }

Когда я при изменении ячеек или строк ничего не происходит, хотя, если я изменю любую другую ячейку после выбора другой даты, обновление пройдет нормально (так как оно обнаружит изменение строки по сравнению с другой изменяемой ячейкой).

Может кто-нибудь предоставить немного помощи по этому поводу, пожалуйста?

Спасибо за ваше время и помощь, это очень ценится.

1 Ответ

1 голос
/ 14 февраля 2020

Редактирование происходит в элементе управления DatePicker, а не на уровне строки DataGrid.

Решение: - Вам необходим элемент управления DatePicker, чтобы подписаться на SelectedDateChangedEvent и внутри событие, вам нужно вызвать datagrid.BeginEdit();, что позже вызовет событие DataGrid_RowEditEnding, как только вы закончите редактирование элемента управления DatePicker.

Как подписаться на событие в C# Код.

Объявить переменную делегата Action на уровне класса

Action delegateCommand = null;

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

   private void DateTimePicker_SelectionChange()
    {
        da.BeginEdit();
    }

Добавить ссылку на вновь созданный метод в делегат действия.

  delegateCommand = DateTimePicker_SelectionChange;
  datePickerFactoryElem.AddHandler(DatePicker.SelectedDateChangedEvent, delegateCommand, false);

Когда вы изменяете дату из DatePicker, событие selectionChanged будет вызываться, и внутренне вы будете вызывать событие RowEditEnding объекта DataGrid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...