none
兩張表單之間傳值的問題 RRS feed

  • 問題

  • 各位前輩

    不好意思請教一下,小弟目前遇到了一個表單之間傳值的問題,已參考過板上之前的文章,也的確解決了部份的問題,剩下的部份實在是不知道是什麼原因,所以請各位前輩可以解惑一下。

    目前有表單A(frm_A)及表單B(frm_B)兩張表單

    frm_A上主要有2組 textbox 及1組 Listviw
    frm_B上主要有4組 textbox

    當我在 frm_A 下的 Listview 任一個item上按下enter之後,會將值傳到 frm_B 上的4個textbox 中,以上的動作均可正常無誤執行。

    而當我在 frm_B 上編輯完之後,想將 frm_B上這4組textbox傳回 frm_A上的 Listview中時,卻會發生「ArgumentOutOfRangeException」的錯誤訊息,但在測試時有試過將 frm_B的 Textbox 的值傳回 frm_A的 textbox 中時,卻是正常無誤的,由於爬了文章之後還是找不出解決的原因,如果前輩您知道如何解決此問題時,還請教導一下。謝謝

    以下為 frm_A 傳到 frm_B 的部份程式碼 (frmA傳frmB時,正常無誤)

    Dim info2 As Form2 = New Form2
    tmp_index = lvw.FocusedItem.Index
    info2.frm2_t01.Text = lvw.Items.Item(tmp_index).Text
    info2.frm2_t02.Text = lvw.Items.Item(tmp_index).SubItems(1).Text
    info2.frm2_t03.Text = lvw.Items.Item(tmp_index).SubItems(2).Text
    info2.frm2_t04.Text = lvw.Items.Item(tmp_index).SubItems(3).Text

    以下為 frm_B 傳回 frm_A 的部份程式碼(會產生ArgumentOutOfRangeException錯誤)

    Dim frm As Form1 = New Form1
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(1).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(2).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(3).Text = frm2_t04.Text

     

     

    2006年10月24日 上午 01:23

解答

  • 你在開啟 Form2 的時候,應該不能把 Form1 關閉,並且在 Form2 保留一個可以連結到 Form1 的地方 .
    例如,你可以使用全域變數,來保存 Form1 的物件狀態,然後 Form2 可以透過全域變數存取 Form1.

    而你的程式並沒有把 frm 設定給 Form1 物件實體,當然會是 Null Reference...

    Dim frm As Form1 ' 只是宣告並沒有連結到 Form1 的物件實體
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t04.Text

    你應該要用像這樣的方法:

    Dim frm As Form1 = Global.Form1Instance ' Global.Form1Instance 是已經存在 Form1 物件實體的全域變數
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t04.Text

    2006年10月24日 上午 04:05

所有回覆

  • Dim frm As Form1 = New Form1
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(1).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(2).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(3).Text = frm2_t04.Text

    你在你的 Form1 的建構式中有初始化 ListView,把資料都填進去嗎 ?
    而且,你必須要確定 tmp_index 沒有超出 ListView 現有資料的最大索引值(如果你的 tmp_index = 3,而 ListView 的資料最大索引是 2 的話,就會發生 ArgumentOutOfRangeException(參數超出範圍))

    2006年10月24日 上午 02:07
  • 您好

    tmp_index變數設在模組當中

    public tmp_index as integer

    在frm_a要傳到frm_b時,有將 lvw.focuseditem.index 的值帶給tmp_index中

    在測試的過程中,曾經直接指定tmp_index的值,像是

    frm.lvw.items.item(0).text = frm2_t01.text

    不過還是一樣會產生 ArgumentOutOfRangeException的訊息(圖一),由於是將listview中的一組item導到新表單做修改(圖二),所以應該是不會有超出索引範圍的問題才對。

    但是,曾經測試將值導到frm_a中的其它地方,像是textbox中

    frm.t01.text = frm2_t01.text

    這樣就不會產生錯誤訊息。

    圖一:http://xs208.xs.to/xs208/06432/q02.jpg

    圖二:http://xs208.xs.to/xs208/06432/q01.jpg

    2006年10月24日 上午 03:03
  • 我不知道你有沒有看到我這句:

    你在你的 Form1 的建構式中有初始化 ListView,把資料都填進去嗎 ?

    你的程式碼中,是 "new" 一個新的 Form,我無法確定你的資料有被填進 ListView.

    2006年10月24日 上午 03:19
  • 您好

    我了解您的意思了
    那麼如果不是去new一個新的form的話,只是單純的將值導回原先表單中的那組item中的話
    有可參考的作法嗎?

    Dim frm As Form1
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t04.Text

    我將 new form1移掉之後,在執行時會產生「NullReferenceException」的錯誤訊息出來。

    2006年10月24日 上午 03:41
  • 你在開啟 Form2 的時候,應該不能把 Form1 關閉,並且在 Form2 保留一個可以連結到 Form1 的地方 .
    例如,你可以使用全域變數,來保存 Form1 的物件狀態,然後 Form2 可以透過全域變數存取 Form1.

    而你的程式並沒有把 frm 設定給 Form1 物件實體,當然會是 Null Reference...

    Dim frm As Form1 ' 只是宣告並沒有連結到 Form1 的物件實體
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t04.Text

    你應該要用像這樣的方法:

    Dim frm As Form1 = Global.Form1Instance ' Global.Form1Instance 是已經存在 Form1 物件實體的全域變數
    frm.lvw.Items.Item(tmp_index).Text = frm2_t01.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t02.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t03.Text
    frm.lvw.Items.Item(tmp_index).SubItems(tmp_index).Text = frm2_t04.Text

    2006年10月24日 上午 04:05