Вы должны установить DefaultValueAttribute
в своем классе Bar. Альтернативой также было бы установить свойство null
.
https://dotnetfiddle.net/aEoBlT
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
var inputs = new List
Выход:
normal:
{
"Prop2": "",
"Bar": {
"Prop2": null
}
}
custom:
{
"Prop2": "",
"Bar": {}
}
CellValidating не вызывается, пока вы не измените CurrentCell. Таким образом, я решил обойти CurrentCell, а затем переключиться обратно на текущий.
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Enter)
{
DataGridViewCell currentCell = CurrentCell;
EndEdit();
CurrentCell = null;
CurrentCell = currentCell;
return true;
}
return base.ProcessDialogKey(keyData);
}
спасибо за решение. моя версия немного отличается от вашей, потому что когда я перехожу в другую ячейку, мой код возвращается e.cancel = false в событии проверки ячейки, будет сгенерирована ошибка, говорящая о том, что: «операция не удалась, потому что программа не может зафиксировать или выйти из изменения значения ячейки». поэтому я поставил попытку уловить, чтобы преодолеть эту проблему.
это мой код:
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
Dim key As Keys = (keyData And Keys.KeyCode)
If key = Keys.Enter Then
If MyBase.CurrentCell.ColumnIndex = 1 Then
Dim iRow As Integer = MyBase.CurrentCell.RowIndex
MyBase.EndEdit()
Try
MyBase.CurrentCell = Nothing
MyBase.CurrentCell = MyBase.Rows(iRow).Cells(1)
frmFilter.cmdOk_Click(Me, New EventArgs)
Catch ex As Exception
End Try
Return True
End If
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
, если источником данных DataGridView является BindingSouce, сделайте следующее (поместите это в свои события обработки ключей ):
bds.EndEdit();
, если источником данных DataGridView является DataTable:
this.BindingContext[dgv.DataSource].EndCurrentEdit();
Нет, но можно вручную запустить событие CellValidating. Просто создайте надлежащие параметры. Все события, класс с помощью Шаблона The Observer, они не отличаются, чем какой-либо другой метод. Если это не работает, можно создать событие KeyPress на ячейке и эмулировать Enter нажатия на ячейке, но это может смешать с пользователями UI, просто отложить карат, где это было.