.netvb.netdatagridview

how to fill data from another datagridview to main datagridview in vb.net


I'm trying to fill data from another datagridview to main datagridview in vb.net

But result in frmMaindt nothing appears or the problem of data not transferring when I clicked button event ("btnOK") in frmSearchdt

Is there something wrong with the code?

addition, is it possible to implement if I use a keyboard shortcut to call a form instead of using DataGridViewButtonColumn?

Please guide me

Thanks

Code in frmMaindt

Public Class frmMaindt
    Public dtMainGrid As DataTable = New DataTable
    Public flag As Boolean = False
    Sub Header()

        dtMainGrid.Columns.Add("Item")
        dtMainGrid.Columns.Add("Item Description")
        dtMainGrid.Columns.Add("Qty")
        dtMainGrid.Columns.Add("Item Unit")
        dtMainGrid.Columns.Add("Unit Price")

    End Sub
    Sub BindGrid()

        Header()

        Dim row As DataRow = dtMainGrid.NewRow

        row("Item") = ""
        row("Item Description") = ""
        row("Qty") = ""
        row("Item Unit") = ""
        row("Unit Price") = ""
        dtMainGrid.Rows.Add(row)

        DataGridView1.DataSource = dtMainGrid
        DataGridView1.Refresh()

        DataGridView1.ColumnHeadersVisible = True


        Dim x As Integer = 0
        For Each item In dtMainGrid.Columns

            DataGridView1.Columns(x).HeaderText = item.ToString
            DataGridView1.Columns.Item(x).SortMode = DataGridViewColumnSortMode.NotSortable
            x = x + 1

        Next



        Dim btn As New DataGridViewButtonColumn
        btn.HeaderText = ""
        btn.Text = "SEARCH"
        btn.Name = "btn"
        btn.DefaultCellStyle.BackColor = Color.Black
        btn.DefaultCellStyle.ForeColor = Color.White
        btn.UseColumnTextForButtonValue = True
        DataGridView1.Columns.Insert(0, btn)

        DataGridView1.Columns(0).Width = 50
        DataGridView1.Columns(1).Width = 100
        DataGridView1.Columns(2).Width = 100
        DataGridView1.Columns(3).Width = 100
        DataGridView1.Columns(4).Width = 100
        DataGridView1.Columns(5).Width = 100

        DataGridView1.Columns(0).ReadOnly = True
        DataGridView1.Columns(1).ReadOnly = False
        DataGridView1.Columns(2).ReadOnly = True
        DataGridView1.Columns(3).ReadOnly = False
        DataGridView1.Columns(4).ReadOnly = True
        DataGridView1.Columns(5).ReadOnly = True



        DataGridView1.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        DataGridView1.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DataGridView1.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DataGridView1.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        DataGridView1.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        DataGridView1.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight



        DataGridView1.Columns(3).DefaultCellStyle.Format = "#,###,###,##0"
        DataGridView1.Columns(5).DefaultCellStyle.Format = "#,###,###,##0.#0"



        DataGridView1.AllowUserToAddRows = False
        DataGridView1.ScrollBars = ScrollBars.Both
        DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing



    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        txtRowIdx.Text = "0"
        'DataGridView1.Rows(txtRowIdx.Text).Cells(1).Value = ""

        BindGrid()

    End Sub


    Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick




        txtRowIdx.Text = e.RowIndex

        If e.Button = MouseButtons.Left AndAlso e.ColumnIndex = 0 Then


            Dim frmSearchdt As frmSearchdt = New frmSearchdt()

            frmSearchdt.txtRowIndex.Text = e.RowIndex
            frmSearchdt.txtRowIndexSearch.Text = "0"


            Dim result As DialogResult = frmSearchdt.ShowDialog()

            If result = DialogResult.OK Then

                DataGridView1.Rows(frmSearchdt.RowIndexMainGrid).Cells(1).Value = frmSearchdt.ItemCode
                DataGridView1.Rows(frmSearchdt.RowIndexMainGrid).Cells(2).Value = frmSearchdt.ItemDesc
                DataGridView1.Rows(frmSearchdt.RowIndexMainGrid).Cells(3).Value = frmSearchdt.Qty
                DataGridView1.Rows(frmSearchdt.RowIndexMainGrid).Cells(4).Value = frmSearchdt.ItemUnit
                DataGridView1.Rows(frmSearchdt.RowIndexMainGrid).Cells(5).Value = frmSearchdt.UnitPrice


            End If



        End If

        If e.ColumnIndex = 1 Then

            Try
                If flag = True Then

                    If Not IsDBNull(DataGridView1.Rows(txtRowIdx.Text).Cells(1).Value) Then

                        DataGridView1.CurrentCell = DataGridView1.Rows(txtRowIdx.Text).Cells(1)

                    End If

                End If


            Catch ex As Exception
                Return
            End Try

        End If

    End Sub
End Class

Code in frmSearchdt

Public Class frmSearchdt
    Public _rowIndexMainGrid As String = ""
    Public _item As String = ""
    Public _itemDesc As String = ""
    Public _qty As String = ""
    Public _itemUnit As String = ""
    Public _unitPrice As String = ""


    Public Property RowIndexMainGrid As String
        Get
            Return _rowIndexMainGrid
        End Get
        Set(ByVal value As String)
            _rowIndexMainGrid = value
        End Set
    End Property
    Public Property ItemCode As String
        Get
            Return _item
        End Get
        Set(ByVal value As String)
            _item = value
        End Set
    End Property

    Public Property ItemDesc As String
        Get
            Return _itemDesc
        End Get
        Set(ByVal value As String)
            _itemDesc = value
        End Set
    End Property

    Public Property Qty As String
        Get
            Return _qty
        End Get
        Set(ByVal value As String)
            _qty = value
        End Set
    End Property

    Public Property ItemUnit As String
        Get
            Return _itemUnit
        End Get
        Set(ByVal value As String)
            _itemUnit = value
        End Set
    End Property

    Public Property UnitPrice As String
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As String)
            _item = value
        End Set
    End Property

    Sub BindGrid(ByVal isSearch As Boolean, ByVal searchBy As String)

        Dim dt As DataTable = New DataTable

        Dim data As Datadt = New Datadt()

        dt = Data.GetData()

        If (isSearch) Then

            Dim dv As New DataView(dt)

            dv.RowFilter = searchBy
            DataGridView1.DataSource = dv
        Else
            dt.Select()
            DataGridView1.DataSource = dt
        End If

        DataGridView1.Refresh()

        DataGridView1.ColumnHeadersVisible = True


        'Dim x As Integer = 0
        'For Each item In dt.Columns

        '    DataGridView1.Columns(x).HeaderText = item.ToString
        '    x = x + 1

        'Next



        DataGridView1.Columns(2).Visible = False
        DataGridView1.Columns(3).Visible = False

        DataGridView1.Columns(0).Width = 100
        DataGridView1.Columns(1).Width = 350

        DataGridView1.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DataGridView1.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

        DataGridView1.ScrollBars = ScrollBars.Both
        DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing


        DataGridView1.ReadOnly = True


    End Sub
    Private Sub frmSearchdt_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        BindGrid(False, "")

    End Sub
    Sub SelectedRow(ByVal index As Integer)


        Me.Hide()


        Dim rowIndexMainGrid = CInt(txtRowIndex.Text)

        _rowIndexMainGrid = rowIndexMainGrid

        _item = DataGridView1.Rows(index).Cells(0).Value
        _itemDesc = DataGridView1.Rows(index).Cells(1).Value
        _qty = "0"
        _itemUnit = DataGridView1.Rows(index).Cells(2).Value
        _unitPrice = DataGridView1.Rows(index).Cells(3).Value


    End Sub
    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
        SelectedRow(CInt(txtRowIndexSearch.Text))
    End Sub
    Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick

        txtRowIndexSearch.Text = e.RowIndex

    End Sub
    Private Sub DataGridView1_CellContentDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentDoubleClick

        SelectedRow(e.RowIndex)

    End Sub
End Class

code in Datadt

Public Class Datadt


    Public Function GetData() As DataTable

        Dim dt As DataTable = New DataTable

        Try


            dt.Columns.Add("Item")
            dt.Columns.Add("Item Description")
            dt.Columns.Add("Item Unit")
            dt.Columns.Add("Unit Price")

            Dim row As DataRow = dt.NewRow

            row("Item") = "B-0001"
            row("Item Description") = "Laptop ASUS E4567 RAM 8 GB"
            row("Item Unit") = "PCS"
            row("Unit Price") = "9000000"
            dt.Rows.Add(row)

            row = dt.NewRow
            row("Item") = "B-0002"
            row("Item Description") = "Keyboard Logitech E84"
            row("Item Unit") = "PCS"
            row("Unit Price") = "70000"
            dt.Rows.Add(row)

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return dt

    End Function


End Class

result code in gif


Solution

  • Please learn to use the debugger. It will help you enormously. In your case, if you had set a breakpoint within CellMouseClick in frmMaindt DataGridView1 when you call the frmSearchdt, you would have seen that on returning from the ShowDialog() the following if statement fails (If result = DialogResult.OK Then). This should have been sufficient to point you in the right direction. In the SelectedRow function you are hiding frmSearchdt, which has been instantiated as a Dialog, but you are nowhere setting its DialogResult property.

    All you need to do, is to add the following line at the end of SelectedRow:

    DialogResult = DialogResult.OK