DataGridViews, DataBinding и не проверяющие значения ячеек - PullRequest
1 голос
/ 11 мая 2010

Позволяет упростить. Допустим, у меня есть этот класс:

class Foo
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int height{ get; set; }
    ...
}

и у меня DataGridView.DataSource связан с BindingList<Foo> с N столбцами, каждый из которых связан с каждым свойством.

Мне нужно:

  • Разрешить пользователю вводить неподтвержденные возраст, высоту и т. Д. (Например, "aaa")
  • Цвет ячеек с недействительными значениями (красный фон)
  • Сохранять недействительные значения, отображаемые до тех пор, пока форма не будет закрыта (я не хочу потерять введенные значения, пока форма не будет закрыта, поэтому у пользователя есть возможность исправлять плохие ячейки в любое время, когда он захочет ДО закрытия формы)
  • Сохраните последние правильные значения, введенные для каждой ячейки с введенными недействительными значениями.
  • Когда форма закрыта, отбросьте непроверяющие значения и сохраните последние введенные правильные значения.

Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

У меня вчера та же проблема со столбцом даты.

Я обнаружил события CellFormatting и CellParsing, но BindingSource, похоже, их игнорирует. Я так и сделал. Я использовал камеру. Свойство тега. dgv - это DataGridView здесь.

  private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (IsBirthdayColumn(e.ColumnIndex))
        {
            e.Value = dgv[e.ColumnIndex, e.RowIndex].Tag;
            if (e.Value is DateTime)
            {
                e.Value = ((DateTime)e.Value).ToShortDateString();
            }
            e.FormattingApplied = true;
        }
    }

    private void dgv_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
    {
        DateTime date;
        if (IsBirthdayColumn(e.ColumnIndex))
        {
            if (e.Value != null && DateTime.TryParse(e.Value.ToString(), out date))
            {
                e.Value = date;
                dgv[e.ColumnIndex, e.RowIndex].Tag = e.Value;
            }
            else
            {
                dgv[e.ColumnIndex, e.RowIndex].Tag = e.Value;
                e.Value = DBNull.Value;
            }
            e.ParsingApplied = true;
        }
    }

   private void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        DateTime date;
        if (IsBirthdayColumn(e.ColumnIndex))
        {
            var cell = dgv[e.ColumnIndex, e.RowIndex];
            if (e.FormattedValue != null && !DateTime.TryParse(e.FormattedValue.ToString(), out date))
            {
                if (e.FormattedValue.ToString().Trim().Equals(""))
                {
                    cell.ErrorText = string.Empty;
                    return;
                }
                cell.ErrorText = "Invalid date format";
            }
            else
            {
                cell.ErrorText = string.Empty;
            }
        }
    }

Также вам нужно обработать событие DataError

    private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        ......
        e.Cancel = false;
        ......
    }

Теперь вы можете написать что-нибудь в столбце даты. В случае неверной даты он покажет значок ошибки и сохранит DBNull в DataSet. В случае пустой строки он просто сохранит DBNull.

1 голос
/ 11 мая 2010

Я не могу ответить на все это, но я могу сделать красный фон.

Сначала вам нужно будет обработать дескриптор DataGridView.CellValidating и установить для e.Cancel значение true во время события.

Если вам нужен красный фон вместо красного восклицательного знака (это поведение по умолчанию), вам нужно создать унаследованный класс DataGridTextBox и переопределить DataGridViewCell.PaintErrorIcon, который позволит вам нарисовать ячейку красным вместо красного восклицательного знака.

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