【问题标题】:How to access data from calling object in vb.net如何从 vb.net 中的调用对象访问数据
【发布时间】:2020-06-26 15:56:15
【问题描述】:

我在 vb.net 中有一个 Window-Form 'caller',其中包含一个 datagridview 和一个特定对象的小概览表,每个对象在第一列都有自己的 ID。现在,如果双击一行,我想显示一个“编辑”对话框,在这里可以编辑该行的许多我不想在概览表中显示的详细信息。

我的方法如下:在调用者表单中我写了这个来调用'edit':

Private Sub dgdata_dbclick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dg_data.CellMouseDoubleClick
        Dim f_edit As New edit
        f_edit.ShowDialog(Me)
End Sub

效果很好。

但是,在所谓的“编辑”表单中,我需要检查选择了哪个 ID 并从数据库中加载此数据以进行编辑。我可以使用例如从调用表单“调用者”访问一些数据

MsgBox(CType(Me.Owner, caller).Text)

显示“调用者”的窗口标题。但是,我想在 datagridview 中提取当前选择的 ID,或者至少提取一些包含它的变量。在调用者表单中,这可以通过评估轻松完成

dg_data.Item(0, selectedRow).Value.ToString

但我无法访问“来电者”中的任何相关信息。我有一个带有一些全局变量的公共类,但我也无法访问它们。

也许我解决这个问题的策略不是最聪明的方法?基本上,当有人单击概览表中的一行时,我想打开一个非常详细的编辑窗口,但只要编辑窗口打开,就会同时阻止应用程序的其余部分。 谢谢!

【问题讨论】:

    标签: vb.net dialog showdialog


    【解决方案1】:

    这个想法是将数据传递给第二种形式。当您使用 New 关键字创建第二种形式的实例(我的类称为 Form2,您的类称为 edit)时,Sub New 会在 Form2 上调用。

    Private Sub OpenEditDialog()
        Dim f_edit As New Form2(32) '32 is the number you retrieve from your DataGridView
        f_edit.ShowDialog(Me)
        f_edit.Dispose()
    End Sub
    

    您将 ID 传递给 Form2 并在表单级别设置一个变量。然后,您可以在 Form2 中的任何位置使用该变量。

    Public Class Form2
    
        Private ID As Long
    
        Public Sub New(SelectedID As Long)
            InitializeComponent()
            ID = SelectedID
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            MessageBox.Show(ID.ToString)
        End Sub
    End Class
    

    您需要致电InitializeComponent() 以便显示控件。

    【讨论】:

    • 嗯,当我添加 InitializeComponent() 时,我的编辑表单只是挂起并且什么都不做。没有这条线,一切正常。
    【解决方案2】:

    您通常如何将数据放入对象中?您设置属性或将参数传递给方法或构造函数?为什么这会有所不同?决定要使用哪个,然后在表单中编写该代码。如果它是必需的数据,我会建议一个构造函数。只需在您的表单中编写此代码:

    公共子新
    

    然后按 Enter。这将自动生成一些额外的代码。然后你可以添加一个字段来存储值,给构造函数添加一个参数,然后将参数分配给里面的字段。

    【讨论】:

    • 非常感谢您向我提供有用的关键字和提示。希望我的解决方案是可以接受的风格......
    【解决方案3】:

    感谢您为我指出正确的路线。 我这样解决了(效果很好,希望可以接受):

    在调用表单中:

    Private Sub dgdata_dbclick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dg_data.CellMouseDoubleClick
        Dim selectedRow As Integer = dg_data.CurrentCell.RowIndex
        Dim f_edit As New edit
        f_edit.edit(dg_data.Item(0, selectedRow).Value.ToString)
        f_edit.ShowDialog(Me)
        f_edit.Dispose()
    End Sub
    

    在被调用的形式中:

    Public Sub edit(ByVal id As Long) 'Handles MyBase.Load
    
    'Enter commands to prepare your form
    
    End Sub
    

    【讨论】:

    • 不完全。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多