将 hhhmm 数据网格视图单元格值转换为 TimeSpan 字段

本文关键字:转换 TimeSpan 字段 单元格 视图 hhhmm 数据 数据网 网格 | 更新日期: 2023-09-27 17:57:14

我想在 DataGridView 列中将 TimeSpan 字段显示为 hhmm。并允许用户以这种格式对其进行编辑。据我了解,我需要向 CellFormatting、CellParsingCellValidating 事件添加一些逻辑。所以我想我必须检查列名,并为那些需要它的人处理它。

但是,为了代码重用的目的,我还能如何更好地解决这个问题呢?我可以创建一个自定义的 DataGridViewColumn 类来放置此逻辑吗? 如何实现这一点? 我看不到 DataGridViewColumn 类存在的任何事件,所以不确定在这里做什么。

将 hhhmm 数据网格视图单元格值转换为 TimeSpan 字段

我会看看DataGridViewColumn.CellTemplate属性,它是这种类型的:

public abstract class DataGridViewCell : DataGridViewElement, ICloneable, IDisposable

它具有以下有趣的属性:

Value: object
ValueType: Type
ValueTypeConverter: TypeConverter

从那里,我会看看TypeConverter课。

希望这有所帮助,这就是我可以在浏览 ILSpy 大约 2 分钟内收集到的内容。

也许对你来说为时已晚,但我想这会帮助其他人。我昨天遇到了几乎相同的问题。我通过为我的 TimeSpan 成员创建类包装器来解决它,其中我覆盖了 ToString 方法(以便以首选格式显示时间)并创建了 Parse(String) 方法,该方法在用户完成单元格编辑时自动调用。最后,为了捕获可能在 Parse 方法中生成的异常,请为 DataGridView 的 DataError 事件创建处理程序。例:

class TimeSpanDecorator
{
    protected TimeSpan timeSpan;
    public TimeSpanDecorator(TimeSpan ts)
    {
        timeSpan = ts;
    }
    public override string ToString() // return required TimeSpan view
    {
        return timeSpan.Hours + ":" + timeSpan.Minutes;
    }
    public static TimeSpanDecorator Parse(String value) // parse entered value in any way you want
    {
        String[] parts = value.Split(':');
        if (parts.Length != 2)
            throw new ArgumentException("Wrong format");
        int hours = Int32.Parse(parts[0]);
        int minutes = Int32.Parse(parts[1]);
        TimeSpanDecorator result = new TimeSpanDecorator(new TimeSpan(hours, minutes, 0));
        if (result.timeSpan.Ticks < 0)
            throw new ArgumentException("You should provide positive time value");
        return result;
    }
    //other members
}
internal partial class MainForm : Form
{
    (...)
    private void dataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        MessageBox.Show("Error occured: " + e.Exception.Message, "Warning!"); // showing generated argument exception
        e.ThrowException = false; // telling form that we have processed the error
    }
}

希望这对任何人都有帮助。