none
Editing record in DataGridView

    Question

  • I have a join query bind to DataGridView.
    SELECT tabA.*, tabB.BName FROM tabA INNER JOIN tabB ON tabA.BCode = tabB.BCode
    When I change the foreign key value (tabA.BCode), the reference field (tabB.BName) does not change immediately unless I refresh the query and binding again.
    Can anyone help and advise me how to make the code with DataGridView that allow the reference field value can be retrieved when entering foreign key value?

    Sunday, April 30, 2017 2:03 AM

Answers

  • That dgvList1_cellvaluechanged event is to allow refresh the reference field value on datagridview before save back the changes to database during addition and modification of records.

    Finally, I tried out to set the dataset table's "BName" column ReadOnly to False, then I can temporary display the updated reference field value in datagridview. After update the changes to database, I can refresh the datagridview from database using join query. Anyway, thanks for you comments.


    Really,

    I see not one piece of code that updates the data base. A datagridview is just a presentation control. 

    Therefore can you show your code for the update. It should not be possible to update with a commandbuilder a datatable retrieved from a join, Therefore I'm really curious for you code. 

    Now persons who see your thread can think all those persons including from Microsoft were fools. I've been to long busy in past because a boss told: "A coworker told he had seen a solution on Internet, and then told I had to search for it."

    Thanks for helping us further.


    Success
    Cor


    Here enclosed the SQL database DDL and the form's VB code. The Save button is to update the changes to database.

    --SQL DB DDL
    USE [zdbTest]
    GO
    CREATE TABLE [dbo].[tabA](
     [ACode] [varchar](5) NOT NULL,
     [BCode] [varchar](5) NOT NULL,
     [Date] [date] NOT NULL,
     CONSTRAINT [PK_tabA] PRIMARY KEY CLUSTERED
    (
     [ACode] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[tabB](
     [BCode] [varchar](5) NOT NULL,
     [BName] [varchar](20) NOT NULL,
     CONSTRAINT [PK_tabB] PRIMARY KEY CLUSTERED
    (
     [BCode] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[tabA]  WITH CHECK ADD  CONSTRAINT [FK_tabA_tabB] FOREIGN KEY([BCode])
    REFERENCES [dbo].[tabB] ([BCode])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[tabA] CHECK CONSTRAINT [FK_tabA_tabB]
    GO

    'VB.net code
    Imports System.ComponentModel
    Imports System.Data.SqlClient

    Public Class frmDgv4
        Dim Con1 As New SqlConnection
        Dim Cmd1 As New SqlCommand
        Dim DA1 As New SqlDataAdapter
        Dim DS1 As New DataSet

        Private Sub Dgv4_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
            Try
                '
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                If Con1.State = ConnectionState.Open Then
                    Con1.Close()
                End If
            End Try
        End Sub

        Private Sub Dgv4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                Con1.ConnectionString = "Server=localhost;User ID=testuser;Password=password;Database=zdbTest"
                Con1.Open()
                Cmd1.Connection = Con1

                Call rtReadData1()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
            Call rtReadData1()
        End Sub

        Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
            Try
                DA1.Update(DS1, "qryA")
                DS1.Tables("qryA").AcceptChanges()

                btnSave.Enabled = False
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub dgvList1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvList1.CellValueChanged
            Dim SqlStr As String
            Dim DR As SqlDataReader

            btnSave.Enabled = True
            Try
                Select Case e.ColumnIndex
                    Case 2
                        dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = ""
                        SqlStr = "SELECT [BName] FROM dbo.[tabB] WHERE [BCode] = '" & dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BCode2").Value & "'"
                        Cmd1.CommandText = SqlStr
                        DR = Cmd1.ExecuteReader
                        If DR.HasRows = True Then
                            While DR.Read()
                                dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = DR.GetValue(DR.GetOrdinal("BName"))
                            End While
                        End If
                        DR.Close()
                End Select
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub dgvList1_UserAddedRow(sender As Object, e As DataGridViewRowEventArgs) Handles dgvList1.UserAddedRow
            dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("Date").Value = Format(Now(), "yyyy-MM-dd")
            btnSave.Enabled = True
        End Sub

        Private Sub dgvList1_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles dgvList1.UserDeletedRow
            btnSave.Enabled = True
        End Sub

        Private Sub rtReadData1()
            Dim SqlStr As String
            Dim DR As SqlDataReader

            Try
                DS1.Clear()

                SqlStr = "SELECT a.[ACode], a.[Date], a.[BCode], (SELECT b.[BName] FROM dbo.[tabB] AS b WHERE b.[BCode] = a.[BCode]) AS [BName] FROM dbo.[tabA] AS a ORDER BY a.[ACode], a.[BCode];"
                Cmd1.CommandText = SqlStr
                DA1.SelectCommand = Cmd1

                DA1.FillSchema(DS1, SchemaType.Mapped, "qryA")
                DA1.Fill(DS1, "qryA")
                DA1.DeleteCommand = New SqlClient.SqlCommandBuilder(DA1).GetDeleteCommand
                DA1.InsertCommand = New SqlClient.SqlCommandBuilder(DA1).GetInsertCommand
                DA1.UpdateCommand = New SqlClient.SqlCommandBuilder(DA1).GetUpdateCommand
                DS1.Tables("qryA").Columns("BName").ReadOnly = False

                dgvList1.AutoGenerateColumns = False
                dgvList1.DataSource = DS1.Tables("qryA")
                dgvList1.Columns.Clear()

                Dim g1col0 As New DataGridViewTextBoxColumn
                g1col0.DataPropertyName = "ACode"
                g1col0.HeaderText = "ACode"
                g1col0.Name = "ACode"
                dgvList1.Columns.Add(g1col0)

                Dim g1col1 As New DataGridViewTextBoxColumn
                g1col1.DataPropertyName = "Date"
                g1col1.HeaderText = "Date"
                g1col1.Name = "Date"
                g1col1.DefaultCellStyle.Format = "yyyy-MM-dd"
                dgvList1.Columns.Add(g1col1)

                Dim g1col2 As New DataGridViewComboBoxColumn
                g1col2.DataPropertyName = "BCode"
                g1col2.HeaderText = "BCode"
                g1col2.Name = "BCode2"
                g1col2.Items.Add("")
                SqlStr = "SELECT [BCode] AS [BCode] FROM dbo.[tabB] ORDER BY [BCode];"
                Cmd1.CommandText = SqlStr
                DR = Cmd1.ExecuteReader
                If DR.HasRows = True Then
                    While DR.Read
                        g1col2.Items.Add(DR.GetValue(DR.GetOrdinal("BCode")))
                    End While
                End If
                DR.Close()
                dgvList1.Columns.Add(g1col2)

                Dim g1col3 As New DataGridViewTextBoxColumn
                g1col3.DataPropertyName = "BName"
                g1col3.HeaderText = "BName"
                g1col3.Name = "BName"
                g1col3.ReadOnly = True
                dgvList1.Columns.Add(g1col3)

                btnSave.Enabled = False
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class


    • Marked as answer by HS-C Thursday, May 4, 2017 2:07 PM
    • Unmarked as answer by HS-C Thursday, May 4, 2017 2:08 PM
    • Marked as answer by HS-C Friday, May 5, 2017 11:47 AM
    Thursday, May 4, 2017 2:06 PM

All replies

  • Hello,

    You should indicate how you are working with data e.g. TableAdapter/DataSet, DataAdapter etc.

    Most likely no matter the method taken you need to access the underlying DataTable row in the DataGridView and update it e.g. CType(SomeBindingSource.DataSource,DataTable).DataRowView.Row.Field(Of x)(y) where x is the type of field and y is the value, then you should see the value updated in the DataGridView from the direct access just explained.


    Please remember to mark the replies as answers if they help and unmark them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.
    VB Forums - moderator
    profile for Karen Payne on Stack Exchange, a network of free, community-driven Q&A sites

    Sunday, April 30, 2017 3:05 AM
    Moderator
  • HS-C,

    I assume you mix up Ado.Net with Ado. 

    The most important difference between both is that Ado.Net is disconnected and Ado is connected. 

    That is what you see with your datatable. You have to retrieve again the data if you change keys. 

    Be aware new databinding should not be needed, but I would do it, as for instance the DataAdapter.Fill means Add and then you got the data twice.


    Success
    Cor

    Sunday, April 30, 2017 4:49 PM
  • Here enclosed my testing code.  I added a event for DataGridView "dgvList1_CellValueChanged" that new record can retrieve the reference field value to the DataGridView. However when I edit existing record, it prompts an exception "System.Data.ReadOnlyException: Column BName is read only.". Can you guide me any practice coding?

    Public Class Form1
        Dim Con1 As New SqlConnection
        Dim Cmd1 As New SqlCommand
        Dim DA1 As New SqlDataAdapter
        Dim DS1 As New DataSet

        Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
            Try
                '
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                If Con1.State = ConnectionState.Open Then
                    Con1.Close()
                End If
            End Try
        End Sub

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                Con1.ConnectionString = pubDbConStr
                Con1.Open()
                Cmd1.Connection = Con1

                Call ReadData()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub ReadData()
            dgvList1.AutoGenerateColumns = False
            dgvList1.DataSource = DS1.Tables("tabA")
            dgvList1.Columns.Clear()

            DS1.Clear()

            SQL = "SELECT tabA.*, tabB.BName FROM dbo.tabA INNER JOIN dbo.tabB ON tabA.BCode = tabB.BCode"
            Cmd1.CommandText = SQL
            DA1.SelectCommand = Cmd1
            DA1.FillSchema(DS1, SchemaType.Mapped, "tabA")
            DA1.Fill(DS1, "tabA")
            DA1.DeleteCommand = New SqlClient.SqlCommandBuilder(DA1).GetDeleteCommand
            DA1.InsertCommand = New SqlClient.SqlCommandBuilder(DA1).GetInsertCommand
            DA1.UpdateCommand = New SqlClient.SqlCommandBuilder(DA1).GetUpdateCommand

            Dim g1col0 As New DataGridViewTextBoxColumn
            g1col0.DataPropertyName = "ACode"
            g1col0.HeaderText = "ACode"
            g1col0.Name = "ACode"
            dgvList1.Columns.Add(g1col0)

            Dim g1col1 As New DataGridViewTextBoxColumn
            g1col1.DataPropertyName = "ADate"
            g1col1.HeaderText = "ADate"
            g1col1.Name = "ADate"
            dgvList1.Columns.Add(g1col1)

            Dim g1col2 As New DataGridViewTextBoxColumn
            g1col2.DataPropertyName = "BCode"
            g1col2.HeaderText = "BCode"
            g1col2.Name = "BCode"
            dgvList1.Columns.Add(g1col2)

            Dim g1col3 As New DataGridViewTextBoxColumn
            g1col3.DataPropertyName = "BName"
            g1col3.HeaderText = "BName"
            g1col3.Name = "BName"
            dgvList1.Columns.Add(g1col3)
        End Sub

        Private Sub dgvList1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvList1.CellValueChanged
            Dim SQL As String
            Dim DR As SqlDataReader

            Try
                Select Case e.ColumnIndex
                    Case 1
                        dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = ""
                        SQL = "SELECT BName FROM dbo.tabB WHERE BCode = '" & dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BCode").Value & "'"
                        Cmd1.CommandText = SQL
                        DR = Cmd1.ExecuteReader
                        If DR.HasRows = True Then
                            While DR.Read()
                                dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = DR.GetValue(DR.GetOrdinal("BName"))
                            End While
                        End If
                        DR.Close()
                End Select
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class


    • Edited by HS-C Wednesday, May 3, 2017 3:59 AM
    Tuesday, May 2, 2017 12:14 PM
  • Here enclosed my testing code.  I added a event for DataGridView "dgvList1_CellValueChanged" that new record can retrieve the reference field value to the DataGridView. 


    That part of your code is complete senseless. 

    You also can remove the code around the commandbuilder, that does not go with a joined Select.


    Success
    Cor

    Tuesday, May 2, 2017 1:03 PM
  • That dgvList1_cellvaluechanged event is to allow refresh the reference field value on datagridview before save back the changes to database during addition and modification of records.

    Finally, I tried out to set the dataset table's "BName" column ReadOnly to False, then I can temporary display the updated reference field value in datagridview. After update the changes to database, I can refresh the datagridview from database using join query. Anyway, thanks for you comments.


    • Edited by HS-C Wednesday, May 3, 2017 3:59 AM
    Wednesday, May 3, 2017 3:58 AM
  • That dgvList1_cellvaluechanged event is to allow refresh the reference field value on datagridview before save back the changes to database during addition and modification of records.

    Finally, I tried out to set the dataset table's "BName" column ReadOnly to False, then I can temporary display the updated reference field value in datagridview. After update the changes to database, I can refresh the datagridview from database using join query. Anyway, thanks for you comments.


    Really,

    I see not one piece of code that updates the data base. A datagridview is just a presentation control. 

    Therefore can you show your code for the update. It should not be possible to update with a commandbuilder a datatable retrieved from a join, Therefore I'm really curious for you code. 

    Now persons who see your thread can think all those persons including from Microsoft were fools. I've been to long busy in past because a boss told: "A coworker told he had seen a solution on Internet, and then told I had to search for it."

    Thanks for helping us further.


    Success
    Cor


    Wednesday, May 3, 2017 7:47 AM
  • That dgvList1_cellvaluechanged event is to allow refresh the reference field value on datagridview before save back the changes to database during addition and modification of records.

    Finally, I tried out to set the dataset table's "BName" column ReadOnly to False, then I can temporary display the updated reference field value in datagridview. After update the changes to database, I can refresh the datagridview from database using join query. Anyway, thanks for you comments.


    Really,

    I see not one piece of code that updates the data base. A datagridview is just a presentation control. 

    Therefore can you show your code for the update. It should not be possible to update with a commandbuilder a datatable retrieved from a join, Therefore I'm really curious for you code. 

    Now persons who see your thread can think all those persons including from Microsoft were fools. I've been to long busy in past because a boss told: "A coworker told he had seen a solution on Internet, and then told I had to search for it."

    Thanks for helping us further.


    Success
    Cor


    Here enclosed the SQL database DDL and the form's VB code. The Save button is to update the changes to database.

    --SQL DB DDL
    USE [zdbTest]
    GO
    CREATE TABLE [dbo].[tabA](
     [ACode] [varchar](5) NOT NULL,
     [BCode] [varchar](5) NOT NULL,
     [Date] [date] NOT NULL,
     CONSTRAINT [PK_tabA] PRIMARY KEY CLUSTERED
    (
     [ACode] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[tabB](
     [BCode] [varchar](5) NOT NULL,
     [BName] [varchar](20) NOT NULL,
     CONSTRAINT [PK_tabB] PRIMARY KEY CLUSTERED
    (
     [BCode] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[tabA]  WITH CHECK ADD  CONSTRAINT [FK_tabA_tabB] FOREIGN KEY([BCode])
    REFERENCES [dbo].[tabB] ([BCode])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[tabA] CHECK CONSTRAINT [FK_tabA_tabB]
    GO

    'VB.net code
    Imports System.ComponentModel
    Imports System.Data.SqlClient

    Public Class frmDgv4
        Dim Con1 As New SqlConnection
        Dim Cmd1 As New SqlCommand
        Dim DA1 As New SqlDataAdapter
        Dim DS1 As New DataSet

        Private Sub Dgv4_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
            Try
                '
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                If Con1.State = ConnectionState.Open Then
                    Con1.Close()
                End If
            End Try
        End Sub

        Private Sub Dgv4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                Con1.ConnectionString = "Server=localhost;User ID=testuser;Password=password;Database=zdbTest"
                Con1.Open()
                Cmd1.Connection = Con1

                Call rtReadData1()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
            Call rtReadData1()
        End Sub

        Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
            Try
                DA1.Update(DS1, "qryA")
                DS1.Tables("qryA").AcceptChanges()

                btnSave.Enabled = False
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub dgvList1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvList1.CellValueChanged
            Dim SqlStr As String
            Dim DR As SqlDataReader

            btnSave.Enabled = True
            Try
                Select Case e.ColumnIndex
                    Case 2
                        dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = ""
                        SqlStr = "SELECT [BName] FROM dbo.[tabB] WHERE [BCode] = '" & dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BCode2").Value & "'"
                        Cmd1.CommandText = SqlStr
                        DR = Cmd1.ExecuteReader
                        If DR.HasRows = True Then
                            While DR.Read()
                                dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("BName").Value = DR.GetValue(DR.GetOrdinal("BName"))
                            End While
                        End If
                        DR.Close()
                End Select
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub dgvList1_UserAddedRow(sender As Object, e As DataGridViewRowEventArgs) Handles dgvList1.UserAddedRow
            dgvList1.Rows(dgvList1.CurrentRow.Index).Cells("Date").Value = Format(Now(), "yyyy-MM-dd")
            btnSave.Enabled = True
        End Sub

        Private Sub dgvList1_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles dgvList1.UserDeletedRow
            btnSave.Enabled = True
        End Sub

        Private Sub rtReadData1()
            Dim SqlStr As String
            Dim DR As SqlDataReader

            Try
                DS1.Clear()

                SqlStr = "SELECT a.[ACode], a.[Date], a.[BCode], (SELECT b.[BName] FROM dbo.[tabB] AS b WHERE b.[BCode] = a.[BCode]) AS [BName] FROM dbo.[tabA] AS a ORDER BY a.[ACode], a.[BCode];"
                Cmd1.CommandText = SqlStr
                DA1.SelectCommand = Cmd1

                DA1.FillSchema(DS1, SchemaType.Mapped, "qryA")
                DA1.Fill(DS1, "qryA")
                DA1.DeleteCommand = New SqlClient.SqlCommandBuilder(DA1).GetDeleteCommand
                DA1.InsertCommand = New SqlClient.SqlCommandBuilder(DA1).GetInsertCommand
                DA1.UpdateCommand = New SqlClient.SqlCommandBuilder(DA1).GetUpdateCommand
                DS1.Tables("qryA").Columns("BName").ReadOnly = False

                dgvList1.AutoGenerateColumns = False
                dgvList1.DataSource = DS1.Tables("qryA")
                dgvList1.Columns.Clear()

                Dim g1col0 As New DataGridViewTextBoxColumn
                g1col0.DataPropertyName = "ACode"
                g1col0.HeaderText = "ACode"
                g1col0.Name = "ACode"
                dgvList1.Columns.Add(g1col0)

                Dim g1col1 As New DataGridViewTextBoxColumn
                g1col1.DataPropertyName = "Date"
                g1col1.HeaderText = "Date"
                g1col1.Name = "Date"
                g1col1.DefaultCellStyle.Format = "yyyy-MM-dd"
                dgvList1.Columns.Add(g1col1)

                Dim g1col2 As New DataGridViewComboBoxColumn
                g1col2.DataPropertyName = "BCode"
                g1col2.HeaderText = "BCode"
                g1col2.Name = "BCode2"
                g1col2.Items.Add("")
                SqlStr = "SELECT [BCode] AS [BCode] FROM dbo.[tabB] ORDER BY [BCode];"
                Cmd1.CommandText = SqlStr
                DR = Cmd1.ExecuteReader
                If DR.HasRows = True Then
                    While DR.Read
                        g1col2.Items.Add(DR.GetValue(DR.GetOrdinal("BCode")))
                    End While
                End If
                DR.Close()
                dgvList1.Columns.Add(g1col2)

                Dim g1col3 As New DataGridViewTextBoxColumn
                g1col3.DataPropertyName = "BName"
                g1col3.HeaderText = "BName"
                g1col3.Name = "BName"
                g1col3.ReadOnly = True
                dgvList1.Columns.Add(g1col3)

                btnSave.Enabled = False
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class


    • Marked as answer by HS-C Thursday, May 4, 2017 2:07 PM
    • Unmarked as answer by HS-C Thursday, May 4, 2017 2:08 PM
    • Marked as answer by HS-C Friday, May 5, 2017 11:47 AM
    Thursday, May 4, 2017 2:06 PM