2017-08-02 40 views
0

讓我解釋上下文,我有一個名爲「Menu」的表單調用另一個稱爲「Bill」的表單,我使用Bill表單調用SearchClient表單。在Bill表格中,我有一個datagridview來接收SearchClient窗體的「傳遞行」。C#錯誤傳遞表單之間的參數

我叫比爾的菜單按鈕:

private void button2_Click(object sender, EventArgs e) 
    { Bill bill = new Bill(); 
     bill.Show();} 

不過,我在比爾類參數。

public Bill(string code, string name, string email) 
    { 
     InitializeComponent(); 
     grid.Rows.Add(); 
     grid.Rows[0].Cells[0].Value = code; 
     grid.Rows[0].Cells[1].Value = name; 
     grid.Rows[0].Cells[2].Value = email; 

    } 

我請使用比爾按鈕,在 「SearchClient」 形式:

private void button1_Click(object sender, EventArgs e) 
    { SearchClient searchcli = new SearchClient(); 
     searchcli.ShowDialog();} 

在SearchClient我有一個按鈕,以通過一個DataGridView傳遞行到另一個datagridview的(在比爾找到)

Bill bill = new Bill(grid.SelectedRows[0].Cells[0].Value.ToString(), 
      grid.SelectedRows[0].Cells[1].Value.ToString(), 
      grid.SelectedRows[0].Cells[8].Value.ToString()); 
      bill.Show(); 

當我運行該程序時,消息錯誤是:錯誤「SisStore.Bill」不包含一個構造函數,該構造函數接受0個參數。

我知道錯誤是在這裏,因爲缺少參數:

private void button2_Click(object sender, EventArgs e) 
    { Bill bill = new Bill(); 
     bill.Show();} 

但我只需要比爾和SearchClient之間傳遞信息。菜單只是一種召集賬單表格和後來的SearchClient的方式。有人可以幫助我嗎?謝謝。

+2

這裏可能不少。 1)使參數可選,2)在Bill表單上聲明三個屬性並刪除參數,3)在Search對話框中添加一個事件並從Bill訂閱它。但請記住,當您從搜索對話框中編寫_new Bill(.....)_時,您正在創建Bill的新實例。這些參數傳遞給這個新實例而不是傳遞給調用搜索對話框的Bill實例 – Steve

+0

這些值是_required_用於「Bill」表單的功能嗎?你可以傳遞'null'作爲值還是添加另一個沒有參數的構造函數? –

回答

0

它看起來並不像你所使用的框架完全正確的,但你的情況,不能你剛纔設置法案的屬性您已經構建了它之後,就像這樣:

public Bill() 
{ 
    InitializeComponent(); 
} 

public void init(string code, string name, string email) 
{ 
    grid.Rows.Add(); 
    grid.Rows[0].Cells[0].Value = code; 
    grid.Rows[0].Cells[1].Value = name; 
    grid.Rows[0].Cells[2].Value = email; 
} 

在SearchClient:

private Bill bill; 
public void setBill(Bill bill) 
{ 
    this.bill = bill; 
} 

然後在菜單:

private Bill bill; 
private void button2_Click(object sender, EventArgs e) 
{ 
    this.bill = new Bill(); 
    bill.Show(); 
} 
private void button1_Click(object sender, EventArgs e) 
{ 
    SearchClient searchcli = new SearchClient(); 
    searchcli.setBill(this.bill); 
    searchcli.ShowDialog(); 
} 

再次,在SearchClient:

... your button click function ... 
{ 
    this.bill.init(grid.SelectedRows[0].Cells[0].Value.ToString(), 
     grid.SelectedRows[0].Cells[1].Value.ToString(), 
     grid.SelectedRows[0].Cells[8].Value.ToString()) 
} 
+0

好的,但SearchClient按鈕單擊函數(this.bill.init ...)中有錯誤:在SisStore.exe中發生未處理的類型爲「System.NullReferenceException」的異常。 附加信息:未將對象引用設置爲對象的實例。發生什麼事? – Matthew

+0

你需要在SearchClient中使用this.bill.init之前調用searchcli.setBill(this.bill)。 – ggradnig

+0

對,但是當我編寫searchcli.setBill(this.bill)時,this.bill的賬單有以下錯誤:不包含'bill'的定義,並且沒有找到接受'SisStore.Bill'類型的第一個參數的擴展方法'bill'(您是否缺少using指令或程序集引用?)。我在SearchClient中創建了setBill。 – Matthew

0

您的Bill表單應該有一個零參數構造函數。我建議以下

protected Bill() 
{ 
    InitializeComponent(); 
} 

public Bill(string code, string name, string email): this() 
{ 
    grid.Rows.Add(); 
    grid.Rows[0].Cells[0].Value = code; 
    grid.Rows[0].Cells[1].Value = name; 
    grid.Rows[0].Cells[2].Value = email; 

} 

或者你可以只保留一個無參數的構造和使用對象初始化,而不是創造比爾

Bill bill = new Bill 
{ 
    code = grid.SelectedRows[0].Cells[0].Value.ToString(), 
    name = grid.SelectedRows[0].Cells[1].Value.ToString(), 
    email = grid.SelectedRows[0].Cells[8].Value.ToString() 
}; 
+0

我正在使用受保護的Bill(),所以我運行該程序:由於其保護級別,無法訪問錯誤 – Matthew

+0

我改變了公共和工作,謝謝。 – Matthew