私は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