1

更新しました

winform には、datetimepicker 4 つの通常の texbox と 2 つのマスクされた texbox とバインドされた datagridview があります。

datagridview の cellformatting イベントを使用して、別のデータテーブルから従業員の名前を検索しています。これを達成するために、私は大部分が機能しているSQLステートメントを使用しています。

現時点では、2番目のデータテーブルの異なる列から従業員名を返し、従業員IDの直後のデータグリッドビューの2番目の列に意図したとおりに設定します。

機能していない部分は、退職日 (「FSalida」列) を見て、退職日がない場合、または選択した日付が退職日より前の場合にのみ従業員名を返すことです。つまり、従業員が退職した場合、退職日以降は表示されません。

私が持っているコードはこれです:

 Private Sub PartePersonalDataGridView_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    'This looks up the employee's full name using the employee number from the ID column (first column) 
    Try
        Dim dgvr As DataGridViewRow = DataGridView1.Rows(e.RowIndex)
        If dgvr.Cells(0).Value IsNot Nothing AndAlso dgvr.Cells(0).Value IsNot DBNull.Value Then
            Dim empID As Integer = CInt(dgvr.Cells(0).Value)
            Dim qry = From dr As PersonalObraDataSet.PersonalObRow In PersonalObraDataSet.PersonalOb
            Where (dr.cdTrabajador = empID) And (dr.FSalida = Nothing) Or (dr.FSalida <= txtDate.Text)
            'This returns each part of the name and joins it in the the 2nd column (name column)
            DataGridView1.Rows(e.RowIndex).Cells(1).Value = (qry.First.Nombre1 & " " & qry.First.Nombre2 & " " & qry.First.Apellido1 & " " & qry.First.Apellido2)
            DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = DefaultBackColor
        End If
        'If there is an exemption like the employee doesn't exists this turns the background color red and instead
        'of the name on the second column it shows "employee doesn't exist."
    Catch ex As Exception
        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
        DataGridView1.Rows(e.RowIndex).Cells(1).Value = "ESTE EMPLEADO NO EXISTE"
        Exit Sub

機能していない部分は「And」の後にあります。

Where (dr.cdTrabajador = empID) And (dr.FSalida = Nothing) Or (dr.FSalida <= txtDate.Text)

これはルックアップ テーブルのデータのサンプルです。

ProjectID   EmployeeID  DepartmentID    HIreDate    TerminationDate     Name    Middle  Last
3116        83               1      09/03/2012      27/04/2012          John        Doe     Doe2
3116        373              1      16/11/2012                          Pedro    John       Ortiz
3116        1                1      01/01/2013                          Jose      Maria   Applessed

これを修正するためにあなたの助けをいただければ幸いです。

4

1 に答える 1

0

数行上に解決策があります。DBNull.Value代わりに を使用してNothingください。

Where (dr.cdTrabajador = empID) And (dr.FSalida = DBNull.Value) Or (dr.FSalida <= txtDate.Text)

FSalidaまたは、コンストラクターでフィールドを次のように設定してDateTime.MinValue(とにかくこれが DateTime のデフォルト値だと思います)、PersonalObRowそれに対してチェックすることもできます。次に例を示します。

Class PersonalObRow

Public FSalida As DateTime 'the VB Date keyword is synonymous to System.DateTime

    Public Sub New()

        FSalida = DateTime.MinValue

    End Sub

End Class

またはNullable(Of DateTime)、それを にすることもできます。これにより、それが であったかどうかを確認できますNothing。次に例を示します。

Class PersonalObRow

    Public FSalida As Nullable(Of DateTime) 'or Nullable(Of Date)

End Class
于 2013-07-30T13:41:39.017 に答える