Я могу сделать DataGridView. EndEdit инициировали событие CellValidating?

Вы должны установить 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()
        {new Foo{Prop2 = "" , Bar = new Bar()}};
        foreach (object input in inputs)
        {
            string NormalSerialisation = JsonConvert.SerializeObject(input, Formatting.Indented, new JsonSerializerSettings{});
            string CustomSerialisation = JsonConvert.SerializeObject(input, Formatting.Indented, new JsonSerializerSettings{NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore});
            Console.WriteLine("normal:");
            Console.WriteLine(NormalSerialisation);
            Console.WriteLine("custom:");
            Console.WriteLine(CustomSerialisation);
        }
    }

    public class Foo
    {

        public string Prop2
        {
            get;
            set;
        }

        public Bar Bar
        {
            get;
            set;
        }
    }

    public class Bar
    {
        [DefaultValue("")]
        public string Prop2;
    }
}

Выход:

normal:
{
  "Prop2": "",
  "Bar": {
    "Prop2": null
  }
}
custom:
{
  "Prop2": "",
  "Bar": {}
}

9
задан 2 revs 18 December 2009 в 18:02
поделиться

4 ответа

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);
    }
11
ответ дан 4 December 2019 в 10:34
поделиться

спасибо за решение. моя версия немного отличается от вашей, потому что когда я перехожу в другую ячейку, мой код возвращается 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
1
ответ дан 4 December 2019 в 10:34
поделиться

, если источником данных DataGridView является BindingSouce, сделайте следующее (поместите это в свои события обработки ключей ):

bds.EndEdit();

, если источником данных DataGridView является DataTable:

this.BindingContext[dgv.DataSource].EndCurrentEdit();
2
ответ дан 4 December 2019 в 10:34
поделиться

Нет, но можно вручную запустить событие CellValidating. Просто создайте надлежащие параметры. Все события, класс с помощью Шаблона The Observer, они не отличаются, чем какой-либо другой метод. Если это не работает, можно создать событие KeyPress на ячейке и эмулировать Enter нажатия на ячейке, но это может смешать с пользователями UI, просто отложить карат, где это было.

0
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: