• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

reload DBgridview từ một Form khác

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Điều hành viên: tungblt, vuathongtin

honamhai
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Hai 21/04/2008 4:15 pm
Has thanked: 1 time

reload DBgridview từ một Form khác

Gửi bàigửi bởi honamhai » T.Bảy 03/03/2018 4:30 pm

anh em giúp mình với, mình đang làm 1 cái ct nho nhỏ, nhưng gặp 1 vấn đề chưa biết làm sao.
mình có 1 form để hiển thị dữ liệu, khi mình click vào nút thêm thì nó sẽ mở 1 form thứ 2 trên nền form 1, khi click nút lệnh lưu ở form2 thì dữ liệu sẽ được cập nhật vào data, form 2 vẫn còn nguyên không đóng lại, giờ làm sao để reload lại cái lưới ở form 1 bên dưới.
code như sau:
Form1:
public sub hienluoi()
'code
end sub

private sub nutthem()
dim Frm as new Form2
Frm.ShowDialog(me)
end sub

form 2:

private sub nutluu()
code luu vào data
dim Frm as new Form1
frm.hienluoi()
end sub

mình làm như vậy nhưng cái bdgridview bên dưới nó không có tác dụng
Hình ảnh



FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Hai 05/03/2018 6:52 am

Phải viết hienluoi() dưới hàng ShowDialog ở form 1 mới đúng.
  1. private sub nutthem()
  2.     dim Frm as new Form2
  3.     Frm.ShowDialog(me)
  4.     hienluoi()
  5. end sub

honamhai
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Hai 21/04/2008 4:15 pm
Has thanked: 1 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi honamhai » T.Hai 05/03/2018 8:23 am

Nếu viết như vậy thì nó chỉ load lại khi cái form2 tắt, vấn đề ở đây là cái form2 nó không tắt đi, vẫn tồn tại để nhập tiếp, nhưng cái dbgridview của cái form 1 phải làm mới lại cái dữ liệu.

FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Hai 05/03/2018 11:15 am

Khi dùng ShowDialog để mở cái form nào đó, thì các code viết sau hàng đó sẽ bắt đầu hoạt động khi cái form hiển thị đó tắt đi.
Do đó gọi hàm hienluoi sẽ cập nhật lại dữ liệu ở form1 ngay khi form2 tắt đi.

honamhai
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Hai 21/04/2008 4:15 pm
Has thanked: 1 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi honamhai » T.Hai 05/03/2018 2:06 pm

đúng rồi, nhưng ý mình muốn là. Khi click nút lưu trên form2 thì dữ liệu sẽ được làm tươi trên dbgridview ở form1 ngay và cái form2 nay vẫn không tắt, form2 vẫn tồn tại để nhập tiếp dữ liệu.

giống như thế này:
Hình ảnh

FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Ba 06/03/2018 9:18 am

Với cách viết cũa bạn thì có thể viết lại như sau:
Form1:
  1. public sub hienluoi()
  2. 'code
  3. end sub
  4.  
  5. private sub nutthem()
  6.     If Application.OpenForms().OfType(Of Form2).Any Then
  7.         Application.OpenForms().Item("Form2").Activate()
  8.     Else
  9.         Dim frm = New Form2(Me)
  10.         frm.Show()
  11.     End If
  12. end sub


Form2:
  1. Dim frmParent As Form1
  2. Public Sub New(frm As Form1)
  3.     InitializeComponent()
  4.     frmParent = frm
  5. End Sub
  6.  
  7. Private Sub nutluu()
  8.     'code luu vào data
  9.     frmParent.hienluoi()
  10. End Sub

honamhai
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Hai 21/04/2008 4:15 pm
Has thanked: 1 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi honamhai » T.Ba 06/03/2018 11:18 am

cảm ơn bạn đã giúp đỡ. nhưng vẫn không có tác dụng, cái dbgridview vẫn cứ trơ ra...

FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Tư 07/03/2018 7:29 am

Có lẽ cái code add new record ở form2 cũa bạn không đúng đó.
Form1
  1. Imports System.Data.OleDb
  2. Public Class Form1
  3.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.         If Application.OpenForms().OfType(Of Form2).Any Then
  5.             Application.OpenForms().Item("Form2").Activate()
  6.         Else
  7.             Dim frm = New Form2(Me)
  8.             frm.Show()
  9.         End If
  10.     End Sub
  11.  
  12.     Public Sub HienLuoi()
  13.         Dim dt As New DataTable()
  14.         Dim cmdText As String = "select * from categories"
  15.         Using adapter As New OleDbDataAdapter(cmdText, My.MySettings.Default.ConnectionString)
  16.             adapter.Fill(dt)
  17.             DataGridView1.DataSource = dt
  18.         End Using
  19.     End Sub
  20. End Class

Form2
  1. Imports System.Data.OleDb
  2. Public Class Form2
  3.     Dim frmParent As Form1
  4.     Public Sub New(frm As Form1)
  5.         InitializeComponent()
  6.         frmParent = frm
  7.     End Sub
  8.  
  9.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  10.         Try
  11.             Save()
  12.             frmParent.HienLuoi()
  13.         Catch ex As Exception
  14.             MessageBox.Show(ex.Message, "Error")
  15.         End Try
  16.     End Sub
  17.  
  18.     Private Sub Save()
  19.         Dim cmdText = String.Format("insert into categories(categoryname, description) values ('{0}', '{1}')", TextBox1.Text, TextBox2.Text)
  20.         Using connection As New OleDbConnection(My.MySettings.Default.ConnectionString)
  21.             connection.Open()
  22.             Using cmd As New OleDbCommand(cmdText, connection)
  23.                 cmd.ExecuteNonQuery()
  24.             End Using
  25.             connection.Close()
  26.         End Using
  27.     End Sub
  28. End Class

muaphonui_2010
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 496
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 181 time
Been thanked: 27 time
Liên hệ:

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi muaphonui_2010 » T.Năm 08/03/2018 8:19 am

Chào Anh.
Khi em áp dụng thử code của anh cho mẫu của em thì:
- Khi em pass code có đoạn này vào Form có tên là F_nhaplieu

Mã: Chọn hết

 Dim frmParent As F_bangke

    Public Sub New(frm As F_bangke)
        InitializeComponent()
        frmParent = frm
    End Sub


Thì dẫn đến những code nào có liên quan đến mở form F_nhaplieu đều bị lỗi
VD: lỗi ở dòng Dim frm As New F_nhaplieu()

Mã: Chọn hết

 Dim frm As New F_nhaplieu()
         frm.Name = "F_nhaplieu"
         frm.Show()


Đó là lý do gì vậy anh nhỉ, có áp dụng được cho trường hợp của em ko anh nhỉ
Cảm ơn.

FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Năm 08/03/2018 9:15 am

Nếu vậy thì cần phải viết thêm constructor cho nó nữa.
Cái này có thể viết bằng nhiều kiểu khác nữa, chẳng qua mình sữ lại theo cách viết cũa chũ post mà thôi.
  1. Public Sub New()
  2.     InitializeComponent()
  3. End Sub
  4.  
  5. Public Sub New(frm As Form1)
  6.     InitializeComponent()
  7.     frmParent = frm
  8. End Sub
  9.  
  10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  11.     Try
  12.           Save()
  13.            If frmParent IsNot Nothing Then frmParent.HienLuoi()
  14.     Catch ex As Exception
  15.             MessageBox.Show(ex.Message, "Error")
  16.     End Try
  17. End Sub

FlyingFox
Guru
Guru
Bài viết: 808
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 320 time

Re: reload DBgridview từ một Form khác

Gửi bàigửi bởi FlyingFox » T.Sáu 09/03/2018 9:06 am

Viết theo kiểu dưới này thì sẽ không thay đổi nhiều.

1. Tạo thêm class mới MyFunctions
  1. Imports System.Reflection
  2. Public Class MyFunctions
  3.     Public Shared Function OpenForm(formName As String, Optional ByVal showForm As Boolean = False) As Form
  4.         Dim frm = Application.OpenForms().Item(formName)
  5.         Try
  6.             If frm IsNot Nothing Then
  7.                 If showForm Then frm.Activate()
  8.             Else
  9.                 If showForm Then
  10.                     Dim assem As Assembly = Assembly.GetCallingAssembly()
  11.                     frm = assem.CreateInstance(assem.GetName().Name + "." + formName)
  12.                     If frm IsNot Nothing Then frm.Show()
  13.                 End If
  14.             End If
  15.         Catch ex As Exception
  16.             'do nothing
  17.         End Try
  18.         Return frm
  19.     End Function
  20.  
  21.     Public Shared Function RefreshData(formName As String, functionName As String) As Form
  22.         Dim frm = OpenForm(formName)
  23.         Try
  24.             If frm IsNot Nothing AndAlso Not String.IsNullOrEmpty(functionName) Then
  25.                 frm.GetType().GetMethod(functionName).Invoke(frm, Nothing)
  26.             End If
  27.         Catch ex As Exception
  28.             'Function name not found (NullReferenceException)
  29.         End Try
  30.         Return frm
  31.     End Function
  32. End Class


2. Form1 - nếu chỉ muốn mở cái form mới hay hiện ra lại cái form đã mở ra rồi thì dùng MyFunctions.OpenForm("Form2", True)
  1. Imports System.Data.OleDb
  2. Public Class Form1
  3.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.         MyFunctions.OpenForm("Form2", True)
  5.     End Sub
  6.  
  7.     Public Sub LoadData()
  8.         Dim dt As New DataTable()
  9.         Dim cmdText As String = "select * from categories"
  10.         Using adapter As New OleDbDataAdapter(cmdText, My.MySettings.Default.ConnectionString)
  11.             adapter.Fill(dt)
  12.         End Using
  13.         DataGridView1.DataSource = dt
  14.     End Sub
  15. End Class


3. Form2 - nếu chỉ muốn load lại dữ liệu trong form nào đó thì dùng MyFunctions.RefreshData(tên form, tên function)
  1. Imports System.Data.OleDb
  2. Public Class Form2
  3.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.         Try
  5.             Save()
  6.             MyFunctions.RefreshData("Form1", "LoadData")
  7.         Catch ex As Exception
  8.             MessageBox.Show(ex.Message, "Error")
  9.         End Try
  10.     End Sub
  11.  
  12.     Private Sub Save()
  13.         Dim cmdText = String.Format("insert into categories(categoryname, description) values ('{0}', '{1}')", TextBox1.Text, TextBox2.Text)
  14.         Using connection As New OleDbConnection(My.MySettings.Default.ConnectionString)
  15.             connection.Open()
  16.             Using cmd As New OleDbCommand(cmdText, connection)
  17.                 cmd.ExecuteNonQuery()
  18.             End Using
  19.             connection.Close()
  20.         End Using
  21.     End Sub
  22. End Class
  23.  


Quay về “Visual Basic .NET và C# (VB.NET & C#)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách