2016-11-22 76 views
1

我有一个小问题,我无法弄清楚。我在我的应用程序FORM1中有一个表单。在按钮上单击搜索 - 我在DATAGRIDVIEW中显示用户数据。所以,现在我有数据 - 用户可以选择添加一个新的客户端,所以他们点击一个按钮,我有一个新的窗体弹出。我不关闭Form1 - 我离开它,因为它创造这样一个新的子....子窗体 - 在激活的事件上执行操作

Dim NewMDIChild As New frmNewClient() 
NewMDIChild.MdiParent = MDIContainer 
NewMDIChild.Show() 
MDIContainer.Show() 

现在,用户可以输入数据并保存在frmNEWCLIENT。完成后,他们单击一个名为DONE的按钮,将其返回到FORM1。在这里我想要刷新网格,以便它包含新客户端。但我不知道如何!

我尝试过在窗体的激活事件中这样做 - 但在这种情况下 - 网格在我最初打开FORM1时被加载 - 我不想要。我希望网格在用户打开FORM时为空。我只想在用户关闭FRMNEWCLIENT时重新加载它。

我希望我很清楚。谢谢!

+0

如果您正在添加到底层数据源,则不需要刷新 - 它将自动存在。 – Plutonix

+0

@plutonix我将它保存到sql服务器 - 我使用数据集加载我的网格 - 但我不知道它是否仍然绑定 - siince它不显示新记录。一旦我再次搜索所有记录,它会向我显示已添加的新记录。它适用于其他情况下,我有标签,但我在每种情况下我必须调用我的函数加载网格才能看到新的数据。与选项卡它不同的情况 - 在这里我不知道。如果我应该在表单初始激活时设置一个标志,并且只有在我从其他表单返回时才重新加载该标志? – BobSki

+0

好吧,数据集包含表是数据源。如果向该DataTable添加新记录,只要与该当前过滤器匹配,它们就会自动在使用该DataTable的任何内容中可见。选项卡,表单控件 - 这些都不重要 – Plutonix

回答

2

听起来像你正在寻找一种方式来知道另一种形式的数据库变化。给定一个表单添加或编辑一行,每当另一种形式添加/更改或删除一行,你可以调用一个方法:

Public Sub SampleDSChanged() 
    daSample.Fill(dtSample)  ' refresh 
    dgv1.FirstDisplayedScrollingRowIndex = dgv1.RowCount - 1 
End Sub 

在添加表格/编辑记录:

dbcon.Open() 
Dim rows = cmd.ExecuteNonQuery() 
If rows > 0 Then 
    frmMain.SampleDSChanged() 
End If 

编辑/新窗体,插入或更新记录根据需要使用自己的SQL语句,直接作用于数据库。之后,该方法仅充当通知者。结果:

enter image description here

的“婴儿形式”能够添加或编辑记录,在任何情况下,“告诉”的主要形式,它已经这样做了。 DataGridView只是表明它得到了通知,它可能并不存在。


即使您正在编写以学校为中心的旧式应用程序,也可以利用.NET提供程序的功能。也就是说,不同的参与者(表单)可以对单个数据源进行更改,以便所有相关方立即看到所做的更改。你只需要制作一些可用的数据对象。

即使对于ADD和EDIT和UPSERT方法使用相同的表单,与使用公共数据源一起工作时,编辑/添加表单独立操作的代码也会多出大约五倍。

+0

感谢您的详细示例。 – BobSki

+0

我完全同意 - 在这里完成的方式非常古老。但我希望我能看到一个完整的例子,说添加/编辑所有使用相同的数据源(从你在上个月告诉我,或者听起来像这将是几乎可以在这个应用程序中使用的东西)。另外有时我们所做的不是简单地添加编辑更新,因为我们将更改记录在编辑的特殊表格中,我们记录了我们的DELETES,而不是。我刚刚开始用vb.net编程 - 大部分时间我都在做所有vb6 – BobSki

+1

我已经给你[此链接](http://stackoverflow.com/a/33702351)。一旦你有一个配置的DA,你不需要任何其他SQL或DB代码来维护表格;你可以做*真正*刷新 - DA自己挑选行更改。搜索只是应用行过滤器的问题。这并不排除捎带审计/记录。顺便说一句老学校提到程序规划vs更多的OO。而不是用100行代码复制其他形式的表单,客户(或Widget或其他)类负责 – Plutonix