0

私は2つのフォームを持っています。frmProject にはシステム行のウルトラグリッドがあります。行をダブルクリックすると、frmSystem が開き、frmProject のアクティブな行の詳細が入力されたテキスト ボックスが表示されます。

frmProject の ultragridrow で指定された値と同じ値を frmSystem にロードしてもらいたいです。frmSystem にデータベース テーブル tbl_System から値を読み込ませたくありません。これは、ユーザーが frmSystem に変更を加えた場合、frmSystem が保存されて閉じられるときに、それらの変更が frmProject の背後にあるデータセットに (RaiseEvent RefreshSystemsData を介して) コピーされるためです。ユーザーが同じシステム行の frmSystem を再度開くことにした場合、データベースからデータを取り込むと古い値が表示されます。したがって、frmProject のデータセット行からコピーして、frmSystem にその値をロードさせたいと考えています。

これを踏まえて、frmSystem が開いたときにトリガーする別の RaiseEvent を追加しました。アイデアは、frmProject からシステム データ行を読み取ることでした。

ただし、各フォームに存在するこの RaiseEvent (相互参照) が、おそらくメモリ不足の例外を引き起こしているようです。PopulateSystemsData と SendSystemDataTofrmSystem に関連するコードをコメントアウトしない限り、アプリケーションは読み込まれません。

データ行をパラメータとして InvokeCommand サブルーチンに渡したかったのですが、データベース内のすべてのフォームは frmMain のサブルーチンを介して開かれます。これには、フォームの初期化などを行うための他のコードがたくさん含まれています。接する。

データ行を一連の文字列として InvokeCommand() の Options() 配列に渡すことを考えましたが、それは frmSystem のすべての値が文字列に変換されることを意味し、機能しません。

InvokeCommand コンストラクターなどを変更してみましたが、非常に複雑になり始めたので、アプリケーション全体を壊したくありません!

パブリック関数がそれを行うかどうかはわかりませんでしたが、frmSystem が開かれたときにデータ行が渡される必要があり、それを処理するのは frmMain コードです。

InvokeCommand() サブルーチンの実行時にデータ行の値が必要です (frmMain によって実行されます)。

これを解決する方法はありますか?フォーム コードの簡略版を次に示します。よろしくお願いします。

Public Class frmProject
Private WithEvents frmSystemInst As New frmSystem

Private Sub UGSystem_AfterEnterEditMode(ByVal sender As System.Object, ByVal e As    System.EventArgs) Handles UGSystem.AfterEnterEditMode
            'open System screen for easy editing
'get the active SystemID from ultragrid on frmProject
            Dim intActiveSystemID As Integer = UGSystem.ActiveRow.Cells("SystemID").Value
            Dim intActiveSiteID As Integer = UGSite.ActiveRow.Cells("SiteID").Value
            Dim intSystemID As Integer = 0

            For Each drt As DataRow In DsProjects1.Tables("tbl_System").Rows
                If drt.Item("SystemID") = intActiveSystemID Then
                    Dim i As Integer = drt.Item("RowSaved")
                    If drt.Item("RowSaved") = 1 Then
                        intSystemID = intActiveSystemID
                    End If
                End If
            Next

'This opens frmSystem - executing frmSystem InvokeCommand(...) I would have liked to pass the datarow from frmProject to frmSystem here....
frmMdiParent.openForm("frmSystem", intSystemID & "," &    UGSystem.ActiveRow.Cells("SystemReference").Value & ", " & intActiveSiteID & ", " & intProjectID, -1)

'Get the open frmSystem instance and set it to the instance declared here on frmProject
            For Each f As Form In frmMdiParent.MdiChildren
                If f.Name.Contains("frmSystem") Then
                    frmSystemInst = f
                End If
            Next
        End Sub


Private Sub frmSystemInst_RefreshSystemsData(ByVal d As DataRow) Handles frmSystemInst.RefreshSystemsData
   'JT 9/5/2013: Refresh Systems ultragrid data after the frmSystem is updated and closed

            For Each dr As DataRow In DsProjects1.Tables("tbl_System").Rows
                If dr.Item("SystemID") = d.Item("SystemID") Then
                    For Each dca As DataColumn In dr.Table.Columns
                        For Each dcb As DataColumn In d.Table.Columns
                            If dca.ColumnName = dcb.ColumnName Then
                                dr.Item(dca.ColumnName) = d.Item(dcb.ColumnName)
                            End If
                        Next
                    Next
                End If
            Next

            Me.UGSystem.DataBind()

 'If any System rows exist, mark them as "saved" - this helps distinguish the rows for frmSystem whether the row be already saved to database (correct SystemID), or it's not saved (using a temp SystemID from another row)
            For Each drt As DataRow In Me.DsProjects1.Tables("tbl_System").Rows
                drt.Item("RowSaved") = 1
            Next
        End Sub


Private Sub frmSystemInst_PopulateSystemsData() Handles frmSystemInst.PopulateSystemsData
   'JT 9/5/2013: Send active system datarow from frmProject to frmSystem

        Dim intActiveSystemID As Integer = UGSystem.ActiveRow.Cells("SystemID").Value
        Dim d As DataRow = Nothing

         For Each drt As DataRow In DsProjects1.Tables("tbl_System").Rows
             If drt.Item("SystemID") = intActiveSystemID Then
               d = drt
        End If
        Next

RaiseEvent SendSystemDataTofrmSystem(d)

End Sub

Public Event SendSystemDataTofrmSystem(ByVal d As DataRow)




Public Class frmSystem
Private WithEvents frmProjectInst As New frmProject

Public Sub InvokeCommand(ByVal sender As Object, ByVal e As System.EventArgs, Optional ByVal Options() As String = Nothing) Implements SmartData.MicroGen.IAddIn.IAddIn.InvokeCommand

'get the most recently opened frmProject and set it as the instance from which to get the systems datarow.
For Each f As Form In frmMdiParent.MdiChildren
  If f.Name.Contains("frmProject") Then
     frmProjectInst = f
  End If
Next

'This fires the event on frmProject to get the active system row details.
RaiseEvent PopulateSystemsData()

end sub

'This speaks to frmProject to run the code for updating System ultragrid
Public Event RefreshSystemsData(ByVal d As DataRow)

Private Sub frmProjectInst_SendSystemDataTofrmSystem(ByVal d As DataRow) Handles frmProjectInst.SendSystemDataTofrmSystem
'Copy the System row from frmProject to frmSystem

'Need to add a row to dataset else we'll have nothing to bind to later
Dim rowTemp As DataRow = Me.DsSystemBySystemID1.Tables("get_systems_by_systemID").NewRow
Me.DsSystemBySystemID1.Tables("get_systems_by_systemID").Rows.Add(rowTemp)

  For Each dr As DataRow In DsSystemBySystemID1.Tables("get_systems_by_systemID").Rows
    If dr.Item("SystemID") = d.Item("SystemID") Then
       For Each dca As DataColumn In dr.Table.Columns
         For Each dcb As DataColumn In d.Table.Columns
             If dca.ColumnName = dcb.ColumnName Then
                dr.Item(dca.ColumnName) = d.Item(dcb.ColumnName)
             End If
         Next
       Next
    End If
  Next
End Sub
4

1 に答える 1

0

これは、人々がレビューすることを期待する多くのコードです!

public メソッドを作成する場合は、frmSystemそれを使用して呼び出すことができfrmSystemInst、 (datarow?) を開いた直後にデータを渡すことができます。さらに、参照を呼び出し元のフォームに戻すこともできます。

次に、コマンド ボタンまたはフォームのクローズ イベントを使用frmSystemして、メイン フォームでメソッドを呼び出し、渡した参照を使用してデータを返すことができます。

于 2013-05-10T17:31:04.853 に答える