Преобразовать значение ячейки hhmm DataGridView в поле TimeSpan - PullRequest
3 голосов
/ 23 мая 2011

Я хочу отобразить поле TimeSpan в столбце DataGridView как ччмм . И разрешите пользователю редактировать его в этом формате. Насколько я понимаю, мне нужно добавить немного логики в события CellFormatting, CellParsing и CellValidating . Поэтому я думаю, что я должен проверить имя столбца и обработать его для тех, кто требует этого.

Но как еще я могу лучше решить эту проблему с целью повторного использования кода? Могу ли я создать собственный класс DataGridViewColumn, в который я могу поместить эту логику? Как это будет достигнуто? Я не вижу никаких событий, существующих для класса DataGridViewColumn, поэтому не совсем уверен, что здесь делать.

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Может быть, это слишком поздно для вас, но я думаю, это поможет другим.У меня была почти такая же проблема вчера.Я решил это, создав оболочку класса для моего члена TimeSpan, где я переопределил метод ToString (для отображения времени в предпочтительном формате) и создал метод Parse (String), который вызывается автоматически, когда пользователь заканчивает редактирование ячейки.Наконец, чтобы перехватывать исключения, которые могут быть сгенерированы в методе Parse, создайте обработчик для события DataEridror DataGridView.Пример:

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
    }
}

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 26 июля 2011

Я бы посмотрел на DataGridViewColumn.CellTemplate свойство этого типа:

public abstract class DataGridViewCell : DataGridViewElement, ICloneable, IDisposable

который обладает этими интересными свойствами:

Value: object
ValueType: Type
ValueTypeConverter: TypeConverter

оттуда я бы посмотрел на TypeConverter класс.

Надеюсь, это поможет, вот что я мог бы собрать за 2 минуты просмотра ILSpy .

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