我想在DataGridView列中将 TimeSpan 字段显示为 hhmm 。并允许用户以此格式编辑它。据我了解,我需要为 CellFormatting,CellParsing 和 CellValidating 事件添加一些逻辑。所以我想我必须检查列名,并为那些需要它的人处理它。
但是为了代码重用,我还能如何更好地解决这个问题呢?我可以创建一个自定义的DataGridViewColumn类来放置这个逻辑吗?如何实现?我看不到DataGridViewColumn类存在的任何事件,所以不确定在这里做什么。
答案 0 :(得分:0)
我会看DataGridViewColumn.CellTemplate
属性,属于这种类型:
public abstract class DataGridViewCell : DataGridViewElement, ICloneable, IDisposable
具有以下有趣的属性:
Value: object
ValueType: Type
ValueTypeConverter: TypeConverter
从那里开始,我会查看TypeConverter
类。
希望这会有所帮助,这是我在大约2分钟内通过ILSpy收集的内容。
答案 1 :(得分:0)
对你来说也许为时已晚,但我想这对别人有帮助。昨天我几乎有同样的问题。 我通过为我的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
}
}
希望这对任何人都有帮助。