2012-03-20 29 views
0

私はC#Winformプロジェクトでdatagridviewを持っています。このdatagridviewは、値をデータベースに挿入するために使用されます。各列は対応するdb列まで一致します。DataGridView C#編集後のモード値の書式設定

カラムの1つがDateTimeカラムです。私はそれが正しい形式であることを確認するために、この日付を '検証'したいと思う。理想的には、セルを離れると、選択した日付の時刻形式に変換されます。

私は一連のイベントを使用してこの機能の作成を試みましたが、問題が発生しています。私が持っている問題は、イベントが発生したときに、その値がまだセルに格納されていないことです。私は、例えば、このような何かを行うときしたがって、:

private void Grid_Modify_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    if (Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime") 
    { 
     Grid_Modify[e.ColumnIndex, e.RowIndex].Value = 
      Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss"); 
    } 
} 

問題があり、それはdatetime型に変換された値は、元のセルの値がある - 私はちょうど入力されていない新しい値。これは、セルの値が更新される前にイベントが発生しているためです。

質問:値を変更した日付の書式を設定する最良の方法は何ですか?

私が試した他のイベントは、CellLeave、CellValueChanged、CellValidated、およびCellEndEditです。

注:CellValueChangedイベントは実際に新しいセル値を取得できる唯一のイベントでしたが、イベントハンドラ内の値を変更すると無限ループで捕捉されます。 CellValueChangedで、

private bool _inCellValueChanged = false; 

その後:

答えて

4

最も簡単なのは、あなたの無限ループを回避するためにCellValueChangedイベントハンドラに戻って、グローバル変数を使用することです

if (!_inCellValueChanged && Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime") 
{ 
    _inCellValueChanged = true;   
    Grid_Modify[e.ColumnIndex, e.RowIndex].Value = Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss"); 
    _inCellValueChanged = false; 
} 
+0

私はつもりだった恐れていました – ImGreg

+0

私が持っていた関連する問題は、「Time Columns」と呼ばれていても、TimeColumnsは現在の日付にデフォルト値を設定していました。 DateTimeの部分、およびすべてのユーザー編集できるのは時間部分です。これは実用的な解決策でした。 – mickeyf

関連する問題