DataGridView,数据绑定和非验证单元格值

时间:2010-05-11 19:02:47

标签: c# winforms data-binding datagridview

让我们简化。让我们说我有这个课程:

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

我有一个DataGridView.DataSource绑定到BindingList<Foo>个N列,每个列绑定到每个属性。

我需要:

  • 允许用户输入非验证年龄,身高等(例如“aaa”)
  • 使用非验证值(红色背景)为单元格着色
  • 保留显示的非验证值,直到表单关闭(我不想丢失输入的值,直到表单关闭,因此用户可以选择在关闭表单之前随时更正坏单元格)
  • 保留为每个单元格输入的最后正确值,并输入非验证值。
  • 当表单关闭时,抛弃非验证值并保持输入的最后一个正确值。

有没有简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

我昨天的日期栏也遇到了同样的问题。

我发现了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;
        ......
    }

现在你可以在日期栏中写任何东西。在无效日期的情况下,它将显示错误图标并在DataSet中保存DBNull。在空字符串的情况下,它将只保存DBNull。

答案 1 :(得分:1)

我不能回答所有问题,但我可以做红色背景。

首先需要做的是处理DataGridView.CellValidating并在活动期间将e.Cancel设置为true。

如果你想要一个完整的红色背景而不是一个红色感叹号(这是默认行为),你需要创建一个继承的DataGridTextBox类并覆盖DataGridViewCell.PaintErrorIcon,它将允许你绘制细胞红色而不是红色的感叹号。

相关问题