让我们简化。让我们说我有这个课程:
class Foo
{
public string Name { get; set; }
public int Age { get; set; }
public int height{ get; set; }
...
}
我有一个DataGridView.DataSource
绑定到BindingList<Foo>
个N列,每个列绑定到每个属性。
我需要:
有没有简单的方法可以做到这一点?
答案 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
,它将允许你绘制细胞红色而不是红色的感叹号。