2011-01-04 14 views
1

私はグリッドビューでtimespan値を書式設定するためのこの質問に従っています。winforms - gridviewセルtimespan問題を編集する

Format TimeSpan in DataGridView column

DataGridViewColumn idleTimeColumn = myGridView.Columns["IdleTime"]; 
idleTimeColumn.DefaultCellStyle.FormatProvider = new TimeSpanFormatter(); 
idleTimeColumn.DefaultCellStyle.Format = "m"; 

このセルが編集可能であるので、私は5を入力すると、次のように私は、それはその後、セルに(つまり、5分を意味する)、グリッド内のわずか数分の値をする必要がありdiaplyingよ分を取るが、それは日の値(すなわち、5.00:00:00)としてそれを取る。

フォーマット(mm、%m)に異なる値を試しましたが、これらはすべて同じ出力を与えます。

答えて

2

あなたは、入力値を解析する機能を実装する必要がありますが、セルの書式設定イベントを処理していると信じています。

TimeSpanFormatterを使用して、バインドされたTimeSpanデータを表示用の書式設定された文字列に変換できます。しかし、入力値をTimeSpanに変換することはできません。 DataGridView.CellParsingイベントハンドラの入力値を変換する必要があります。

次は、入力値を解析するサンプルコードです。

DataGridView.CellParsingイベントハンドラ

private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e) 
{ 
    if (e.DesiredType == typeof(TimeSpan)) 
    { 
     TimeSpanParser parser = new TimeSpanParser(); 
     e.Value = parser.Parse(e.Value.ToString(), e.InheritedCellStyle.Format); 
     e.ParsingApplied = true; 
    } 
} 

TimeSpanParserクラス

public class TimeSpanParser 
{ 
    private Regex formatParser; 

    private List<TimeSpanPart> parts; 

    public TimeSpanParser() 
    { 
     this.formatParser = new Regex("d{1,2}|h{1,2}|m{1,2}|s{1,2}|f{1,7}", RegexOptions.Compiled); 
     this.parts = new List<TimeSpanPart>(); 
    } 

    public TimeSpan Parse(string input, string format) 
    { 
     this.parts.Clear(); 
     var pattern = this.formatParser.Replace(format, m => ReplaceFormat(m)); 
     var match = Regex.Match(input, "^" + pattern + "$"); 

     TimeSpan result = new TimeSpan(); 
     for (int i = 1; i < match.Groups.Count; i++) 
     { 
      var value = Convert.ToDouble(match.Groups[i].Value); 
      switch (this.parts[i - 1]) 
      { 
       case TimeSpanPart.Day: 
        result = result.Add(TimeSpan.FromDays(value)); 
        break; 
       case TimeSpanPart.Hour: 
        result = result.Add(TimeSpan.FromHours(value)); 
        break; 
       case TimeSpanPart.Minute: 
        result = result.Add(TimeSpan.FromMinutes(value)); 
        break; 
       case TimeSpanPart.Second: 
        result = result.Add(TimeSpan.FromSeconds(value)); 
        break; 
       case TimeSpanPart.Millisecond: 
        int digit = match.Groups[i].Value.Length; 
        value =value * Math.Pow(10, 3 - digit); 
        result = result.Add(TimeSpan.FromMilliseconds(value)); 
        break; 
      } 
     } 

     return result; 
    } 

    private string ReplaceFormat(Match match) 
    { 
     switch (match.Value) 
     { 
      case "dd": 
      case "d": 
       this.parts.Add(TimeSpanPart.Day); 
       return "(\\d{1,2})"; 
      case "hh": 
      case "h": 
       this.parts.Add(TimeSpanPart.Hour); 
       return "(\\d{1,2})"; 
      case "mm": 
      case "m": 
       this.parts.Add(TimeSpanPart.Minute); 
       return "(\\d{1,2})"; 
      case "ss": 
      case "s": 
       this.parts.Add(TimeSpanPart.Second); 
       return "(\\d{1,2})"; 
      case "fffffff": 
      case "ffffff": 
      case "fffff": 
      case "ffff": 
      case "fff": 
      case "ff": 
      case "f": 
       this.parts.Add(TimeSpanPart.Millisecond); 
       return "(\\d{1,7})"; 
      default: 
       return match.Value; 
     } 
    } 
} 

TimeSpanPart列挙

public enum TimeSpanPart 
{ 
    Day, 
    Hour, 
    Minute, 
    Second, 
    Millisecond, 
} 
-2

mの代わりにmmまたは%mを試してください。 idleTimeColumn.DefaultCellStyle.Format = "mm";

+0

それはしませんでした働いた。 – Sharique

+0

@Sharique: "うまくいきません"と私たちに伝えることは特に役に立ちません。 *なぜ*動作しませんでしたか?あなたはそれを試したときに何を見ましたか、それがあなたが期待/望んだものとどのように異なっていたのですか? –

+0

質問を更新しました。他の形式でも同じ問題が発生します。 – Sharique