2016-10-31 18 views
0

VB.Netとグリッドコントロール内の日付の処理 - より良い方法ですか?

全体的なデザインは、VB.Netを使用してGridViewの(フェーズ1)から200-300レコードを編集できるようにすることです...私は私のアプリを実行している間、私は方法論を疑問視し、「より良い方法」があるかどう思って。データベース自体はSQL Server上にあります。ユーザーが「アプリケーション」に入力する列は数多くあり、必要に応じて「オフィスユーザー」によって編集/維持される列がいくつかあります。この継続的なメンテナンスにはいくつかの日程があり、それが私の質問の第一歩です。私はに走った

問題#1 ...コードの作業を持って、インターネット上の「解決策」を発見したが、それらに疑問を投げかけています

- 日付は、データベース内、および使用して、それらを読み取ろうとしてNULLですSqlDataReaderによってエラーが発生しました(DateオブジェクトにNULLを割り当てることはできません)。これは三項演算子を使用して "IsDBNull"を使用し、DBから読み取った値を代入するか、DateTime.MinValueを代入することにつながりました。問題は "解決されました" ...

問題#2 - 上記の方法を使用すると、VBの最小値である日付が表示されます。ユーザーが編集するフィールドに実際の日付が表示されます。欲しいです。この問題の唯一の解決策は、

日付をDateオブジェクトまたはStringオブジェクトに変換することでした。これにより、データベースでDateが元々NULLであったDateTime.MinValue(テスト可能)に変換しなければならなかった場合に、空の文字列をgridviewに代入できるようになり、次に別の3項演算子"ToString"変換、または空の文字列をgridviewフィールドに割り当てます。

今すぐOk - 編集が完了しました。私はいくつかの "ScriptManager.RegisterStartupScript"コマンドを追加して、ユーザーが入力した日付の有効性をテストできるようにしました。すべて正常です。

問題3(または4) - ユーザーが入力したデータを使用してデータベースを更新する必要があります(データベースを更新する必要があります)。しかし、もう一度 - 日付は文字列で空ですので、 "MinValue"、最初に次に別の三項演算子を割り当てて、 "MinValue"に対して各日付をテストし、日付またはDBNullを割り当てる必要がありました。値...

はい、私は、文字列/日付が空であるかどうかに応じて、いくつかの他のものを除いて、いくつかの日付を含む、いくつかの異なる更新文字列を思い付くことができたと思います...将来のバグにつながるだけなので、私は一連の三項演算子を保持していると思います。

ので、編集処理を開始するためのコードは次のようになります、正直なところ、すべてこの変換を

Dim _date1 As Date 
' see if we can convert the various dates... 
Try 
    ' see if empty… 
    If ((CType((row.Cells(19).Controls(0)), TextBox)).Text).Length < 2 Then 
     _date1 = DateTime.MinValue 
    Else 
     _date1 = DateTime.Parse((CType((row.Cells(19).Controls(0)), TextBox)).Text) 
    End If 
Catch ex As Exception 
    ErrFlag = True 
    ScriptManager.RegisterStartupScript(Me, Page.GetType, "Script", "alert(‘Date1 Date is not valid - enter as MM/DD/YYYY');", True) 
End Try 
. 
. 
. 
Dim sql As String = "UPDATE [foo_bar].[dbo].[bar_foo] set [email protected], …….) 
cmd.Parameters.AddWithValue("@Date1", If(_date1 = DateTime.MinValue, DBNull.Value, _date1)) 

:データベースを更新するために戻ってGridViewのデータを取得する

While sdr.Read 
    Dim _date1 As Date = If(IsDBNull(sdr("date1")), DateTime.MinValue, sdr("date1")) 
. 
. 
. 
‘ Now add them to a List of my Class: 
appsList.Add(New AppClass(… _ 
      If(_date1 = DateTime.MinValue, " ", _date1.ToString("MM/dd/yyyy")), _ 
      …) 

をいくつかの時点でバグやエラーにつながるようだ。

これはこれを処理するための「最良の」方法ですか?よりクリーンな方法はありませんか?

+0

あなたが追加する必要があり、私はあなたのコメントを理解し、適切な技術タグ(Winformsの、Webフォーム、WPF)など – Plutonix

+0

のではなく、ただ一つの技術に非常に特定のそれを放置しないだろう。このうちのいくつかは、グリッドビューだけでなく、DBに日付を戻すことも扱っています。 – TDU

+0

残念ながら、これは月曜日に割り当てられたプロジェクトの1つで、VB.Netで実行する必要があります(VB 2/3日以降にVBを使用していないと言っても、最後に使用したVSは約同じ時代)。だから、月曜に私は割り当てられました、水曜日の半ばに、私は次の週の終わりまで持っていると言われます。私は、木曜日中旬に、次の水曜日まで(週末ではなく)私が持っていることを知らされています。木曜日遅く、翌日仕事の終わりまでにやる必要があると言われています。だから、私は「負の」時間で働いていて、私が持っていた時にできることをしました。 「より良い方法」があるかどうかわかります。 – TDU

答えて

0

winformsを使用している場合は、データバインディングのフォーマットと解析を処理できます。私はGridviewtextboxでそれを試していないが、最悪の場合、カスタムセルテンプレートと、フォーマットと解析ハンドラを持つテキストボックスを使用することができます。コードは次のようになります。

mybinding = New Binding("text", DataSet1, "table1.datefield") 
    Me.DataGridTextBoxColumn1.TextBox.DataBindings.Add(mybinding) 
    AddHandler mybinding.Parse, AddressOf StringToDateTime 
    AddHandler mybinding.Format, AddressOf formatdate 

Private Sub StringToDateTime(ByVal sender As Object, ByVal cevent As ConvertEventArgs) 
    If cevent.Value.GetType().Equals(GetType(String)) And _ 
     cevent.DesiredType Is GetType(DateTime) Then 
     If cevent.Value <> "" Then 
      ' Make sure matches format in format funtion 
      cevent.Value = DateTime.Parse(String.Format(cevent.Value, "MMM d, yy")) 
     Else 
      cevent.Value = DBNull.Value 
     End If 

     'cevent.Value = DateTime.Parse(String.Format(cevent.Value, "MMM d yyyy") 
    End If 
End Sub 

Public Sub formatdate(ByVal sender As Object, ByVal e As ConvertEventArgs) 
    If e.Value.GetType().Equals(GetType(DateTime)) And e.DesiredType Is GetType(String) Then 
     ' Hard-coded or user-specified 
     ' Make sure matches format in parse funtion 
     e.Value = Format(e.Value, "d") 
    End If 
End Sub 
+0

です。ありがとうございます。申し訳ありませんが、私はいくつかの他の重要なタスクに着手しています。 – TDU

+0

私は言った、それは私が飛び込んだフープよりもかなりきれいに見えます。 – TDU

関連する問題