2012-08-05 11 views
0

在我的應用程序中有兩種形式。在我的Form1我有一個列表視圖有一些項目。當我雙擊一行時,我會得到一個彈出窗口,允許我編輯行值。爲此,我使用了doubleclick事件。現在爲彈出式窗口創建新表格 - Form2。我已經將ListView作爲Form1中的內部函數,以便訪問我的form2中的選定行值。在form2加載中,我正在檢索所選行的值以顯示在文本框中,但這會給我錯誤。這是我的代碼:InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index訪問C#中另一種形式的控件數據時發生錯誤

如果我錯了:

//this is in form1 
    private void bufferedListView1_DoubleClick(object sender, EventArgs e) 
    { 
     form2 obj = new form2(); 
     obj.ShowDialog(); 
    } 

    //in form2 
    Form1 o = new Form1(); 
    private void form2_Load(object sender, EventArgs e) 
    { 
     txt_editname.Text = o.bufferedListView1.SelectedItems[0].SubItems[0].Text; 
     txt_editno.Text = o.bufferedListView1.SelectedItems[0].SubItems[1].Text; 
    } 

,我得到的是錯誤?

+0

哦,爲什麼會這樣?我不只是爲form1創建一個對象嗎? – Cdeez 2012-08-05 06:29:36

回答

1

通行證所需的數據在窗口2的構造

public form2(string text1, string text2) 
{ 
    //work with values 
} 

和更改調用代碼這樣:

private void bufferedListView1_DoubleClick(object sender, EventArgs e) 
{ 
    form2 obj = new form2(bufferedListView1.SelectedItems[0].SubItems[0].Text, 
     bufferedListView1.SelectedItems[0].SubItems[1].Text); 
    obj.ShowDialog(); 
} 
+0

我現在有一個新問題。我用你的方式,並工作。但問題是我下次單擊錯誤重複的行時。因爲我不會每次都丟棄對象。所以我加了這個:'obj = null; GC.Collect();'但仍然有一個典型的問題,點擊幾下後,錯誤再次重複。爲什麼會發生? – Cdeez 2012-08-05 07:19:40

+0

當窗體顯示爲模式對話框時,單擊關閉按鈕(窗體右上角帶有X的按鈕)會導致窗體被隱藏 由於作爲對話框顯示的窗體被隱藏當應用程序不再需要表單時,您必須調用表單的Dispose方法而不是關閉。 請參見備註http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx – dantix 2012-08-05 07:24:55

+0

是的,我確實給了一個按鈕來取消並在其中寫入'this.Dispose();'。我點擊列表視圖,form2打開,然後我關閉使用取消按鈕。我做了3-4次,然後我得到了錯誤 – Cdeez 2012-08-05 07:33:41

0
Form1 o = Application.OpenForms["Form1"] as Form1; 
private void form2_Load(object sender, EventArgs e) 
{ 
    txt_editname.Text = o.bufferedListView1.SelectedItems[0].SubItems[0].Text; 
    txt_editno.Text = o.bufferedListView1.SelectedItems[0].SubItems[1].Text; 
} 

您應該檢索已經創建的Form1的實例,而不是新的實例。

0

您的代碼應該是這樣的:

//this is in form1 
    private void bufferedListView1_DoubleClick(object sender, EventArgs e) 
    { 
     form2 obj = new form2 
         { 
          Name = o.bufferedListView1.SelectedItems[0].SubItems[0].Text, 
          No = o.bufferedListView1.SelectedItems[0].SubItems[1].Text, 
         }; 
     obj.ShowDialog(); 
    } 

    //in form2 
    public String Name; 
    public String No; 
    Form1 o = new Form1(); 
    private void form2_Load(object sender, EventArgs e) 
    { 
     txt_editname.Text = Name; 
     txt_editno.Text = No; 
    }