2016-08-16 188 views
0

我試圖開發一個搜索窗口,允許用戶填寫條件,然後單擊搜索按鈕。點擊搜索按鈕後,結果將返回DataGridView。當點擊DataGridView中的結果時,我想將行號傳遞給另一個已打開的表單。VB.Net從一個窗體傳遞datagridview行到另一個窗體已經打開

我知道我可以通過創建表單的新實例來傳遞結果。我通過使用下面的方法變量,以我的搜索窗口:

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 

     Dim ST = New Search_Tool(DGV_Ongoing.DataSource, AgencyOptions, EthnicityOptions, EmploymentTypeOptions, EmploymentStatusOptions, 
             CategoryOptions, OutcomeOptions) 

     ST.Show() 

    End Sub 

但是我不能把我想通過該行的價值,因爲它已經打開(其主要形式)的形式。有沒有辦法解決這個問題?我很努力地找到任何信息,但不會在傳遞數據時調用表單來打開它。

我不能引用Main_form.Main_DGV.CurrentCell,因爲Visual Studio說它需要一個對象引用才能這樣做。

在此先感謝!

+0

您可以在搜索表單上公開一個屬性來獲取答案。你的'ST'對象可能需要不是本地的。此外,而不是返回一個可視對象,請考慮返回像Id或ID數組 – Plutonix

+0

看看[這篇文章](http://stackoverflow.com/a/38769212/3110834)一些很好的選擇。 –

+0

從用戶角度來看:在顯示數據的相同位置搜索會不會更順利?那麼爲了能夠直接在網格上方設置過濾器? –

回答

1

我建議在用戶找到他們想要的內容時引發Search_Tool表單中的事件。

主窗體訂閱了它,然後可以訪問它的數據網格。

Class Search_Tool 
    Inherits Form 

    Public Event SearchResultFound(resultId As Integer) 

    Private Sub OnUserClickedARowOrPressedAButtonOrWhatever() 
     RaiseEvent SearchResultFound(currentRow.Id) 
    End Sub 

End Class 

並在主窗體中。

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 

    Dim ST = New Search_Tool(DGV_Ongoing.DataSource, AgencyOptions, EthnicityOptions, EmploymentTypeOptions, EmploymentStatusOptions, 
            CategoryOptions, OutcomeOptions) 
    AddHandler ST.SearchResultFound, Sub(result As Integer) 
             'handle your result id here. 
             MessageBox.Show("User selected row " & result) 
            End Sub 
    ST.Show() 

End Sub 

這樣做的好處是,SearchForm不需要知道它被使用的是什麼。它只是在那裏給結果,這將使以後更容易重用。

+1

而不是'AddHandler',你可以使用'WithEvents',那麼你不必擔心添加或刪除處理程序***,這就是他們在那裏。只是一個建議,然後它會爲你創建句柄子句,並在事件發生時作出響應。 – Codexer

+0

當我稍後返回到我的項目時,我會放棄這一點。但它是有道理的,所以我相信它會起作用! – SilverShotBee

相關問題