2


1

私は一般的なリストを通して結びついているgridviewを持っています。 私はすべての列を自分で設定しました。 私はただしようとしています:

行が編集されたときにイベントPREフォーマットエラーをキャッチ - 隠しフィールドを介して行情報を取得 - そして永続化

これはかなり簡単なはずですが、フォームの作業はあまり行っていません。また、そのDataGridViewsイベントには慣れていません。

1 Answer


6


これを見るには2つの方法があります。

  • 扱う CellParsingイベントおよび値の解析

  • プロパティでカスタムの `+ TypeConverter +`を使用します

私は通常後者を好む、それはそれがUIからこの論理を奪うからである。例ができるかどうかわかります…

'' '' '

例(このコードの大部分は「show it working」コードです);ここで、日付を* backwards * "dd MMM yyyy"テキストとしてフォーマット/解析する(本当に理由はない) ` MyDateTimeConverter +`を定義し、そのコンバーターをプロパティの1つに関連付けます。 グリッドの値を編集すると、変更がプッシュインされます(「実際の」値の更新を確認するには行を変更します)。 変更通知に関するいくつかのニュアンスのため、すぐには表示されません。このためだけに例を複雑にする価値はありません…​

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows.Forms;

class Person
{
    public string Forename { get; set; }
    public string Surname { get; set; }

    [TypeConverter(typeof(MyDateTimeConverter))]
    public DateTime EditableValue { get { return ActualValue; } set { ActualValue = value; } }
    // this just proves what we have set...
    public DateTime ActualValue { get; private set; }
}
class MyDateTimeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
    }
    const string FORMAT = "dd MMM yyyy";
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value != null && value is string)
        {
            string s = (string)value;
            return DateTime.ParseExact(Reverse(s), FORMAT, CultureInfo.InvariantCulture);
        }
        return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return Reverse(((DateTime)value).ToString(FORMAT, CultureInfo.InvariantCulture));
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
    static string Reverse(string value)
    {
        char[] data = value.ToCharArray();
        Array.Reverse(data);
        return new string(data);
    }
}
class MyForm : Form
{
    public MyForm()
    {
        DataGridView grid = new DataGridView();
        grid.Dock = DockStyle.Fill;
        List people = new List();
        people.Add(new Person { Forename = "Fred", Surname = "Flintstone", EditableValue = DateTime.Today });
        people.Add(new Person { Forename = "Barney", Surname = "Rubble", EditableValue = DateTime.Today.AddDays(-25) });
        grid.DataSource = people;
        Controls.Add(grid);
    }
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new MyForm());
    }
}