2016-01-28 71 views
0

我有兩個Windows窗體。我已經從數據庫中讀取數據並將數據加載到Form1(FrmSelection)Listbox1中。現在我想要的是,當用戶在Form1上從Listbox1中選擇一個值並點擊處理按鈕時,必須在Form2(FrmProcessOrder) Listbox2上加載所選值。我嘗試了不同的例子,但沒有得到它的工作。這裏有以下如何將listbox數據從form1傳遞給form2,並點擊按鈕

1.Run應用程序的步驟

2.FrmSelection空列表框打開,然後單擊這將打開FrmSelection

3.FrmSelections打開了,這種形式包含一個列表框和數據的過程按鈕我已經從數據庫中讀取。從列表框中選擇上FrmSelections項目後

5.Click Addforms按鈕列表框

4.Select一個項目。

  1. 所選項目必須出現在FrmProcessorder列表框中。

問題 - 我得到FrmProcessorder形式錯誤,當我選擇項目後單擊按鈕Addforms(對象不設置到對象的實例)

這裏是我下面的代碼..

Form1中(FrmSelection)

public partial class FrmProcessOrder : Form 
{ 

    public FrmProcessOrder() 
    { 
     InitializeComponent();   
    } 
    private void btnProcess_Click(object sender, EventArgs e) 
    { 
     Program._FrmSelection = new FrmSelection(); 
     Program._FrmSelection.Show(); 
    } 

    public void AddList(ListBox _Listing) 
    { 
     ListBoxForms.Items.AddRange(_Listing.Items); 
    } 
} 

形式2(FrmProcessOrder)

FrmProcessOrder _FrmProcessOrder; 
    public FrmSelection() 
    { 
     InitializeComponent(); 

     LoadData(); 
    } 

    //Method which reads data from the db and laod data on listview 
    public void LoadData() 
    { 
     _connection = "Data Source=MILESTONE-PC;Initial Catalog=Jack;Integrated Security=True"; 
     _sql = "Select * from tblJackon"; 
     _conn = new SqlConnection(_connection); 
     _conn.Open(); 

     _comm = new SqlCommand(_sql, _conn); 
     _adapt.SelectCommand = _comm; 
     _adapt.Fill(_dataset, _sql); 
     DataTable _tbl = _dataset.Tables[0]; 
     _dtrow = null; 

     foreach (DataRow _dataVariable in _tbl.Rows) 
     { 
      _dtrow = _dataVariable; 
      ListBoxSelection.Items.Add((_dtrow["FormNames"])); 
     } 
    } 

    private void btnAddForms_Click(object sender, EventArgs e) 
    { 
     _FrmProcessOrder.AddList(ListBoxSelection); // It throws error on this line after select from listbox so that the item must to FrmProcessOrder listbox 
     _FrmProcessOrder = new FrmProcessOrder();  
    } 
+0

FrmProcessOrder不包含帶0參數的構造函數。您可以嘗試移動代碼,以便在加載表單後加載數據? –

+0

我已經更新了代碼並添加了一些解釋以使其更加清晰。 – JuniorLinq

+0

您能否顯示錯誤? –

回答

1

編輯(問題被編輯後):

檢查:

FrmProcessOrder _FrmProcessOrder; //沒有對象宣稱它是正確的初始化之前

private void btnAddForms_Click(object sender, EventArgs e) 
{ 
    _FrmProcessOrder.AddList(ListBoxSelection); // This is null exception 
    _FrmProcessOrder = new FrmProcessOrder(); //it should not be put here 
} 

_FrmProcessOrder使用。做到這一點,而不是:

FrmProcessOrder _FrmProcessOrder = new FrmProcessOrder(); //Now it is declared, only once 

private void btnAddForms_Click(object sender, EventArgs e) 
{ 
    _FrmProcessOrder.AddList(ListBoxSelection); // Now it should be ok 
} 

原文:

一個最簡單的辦法是把你輸入的字段(或創建一個方法調用做到這一點),而不是作爲一個構造函數參數。

更改此:

public FrmProcessOrder(ListBox _List) 
{ 
    InitializeComponent(); 
    ListBoxForms2.Items.AddRange(_List.Items);   
} 

進入這個

public FrmProcessOrder() 
{ 
    InitializeComponent(); 
} 

public void AddList(ListBox _List){ 
    ListBoxForms2.Items.AddRange(_List.Items);   
} 

然後,當你可以打電話給你的Form方法時,你需要

_FrmProcessOrder.AddList(listBox); 
+0

我必須添加這個代碼(_FrmProcessOrder.AddList(listBox)在選擇表單按鈕下? – JuniorLinq

+0

@JuniorLinq否,你需要在你創建form後調用它,比如你創建它:'FrmProcessOrder _FrmProcessOrder = new FrmProcessOrder );'在你的'FrmSelection'中,然後在它被創建之後,在它被使用之前,你可以調用'_FrmProcessOrder.AddList(listBox);' – Ian

+0

我很困惑......你可以在你發佈的代碼中顯示我。你說,但它不工作 – JuniorLinq

0

在這一行

Application.Run(new FrmProcessOrder()); 

你試圖實例化一個新FrmProcessOrder,但你有一個構造函數是這樣的:

public FrmProcessOrder(ListBox _List) 

,所以你不能沒有一個參數ListBox實例。 如果你想要這個,你必須添加到Form1空構造:

public FrmProcessOrder() 
{ 

} 
+0

我已經更新了代碼並添加了一些解釋以使其更加清晰。 – JuniorLinq

0

相信你已經錯誤地複製的代碼塊(交換Form2 & Form1)。

該行Application.Run(new FrmProcessOrder());應該被替換爲Application.Run(new FrmSelection());這將加載數據庫中的數據。

你看到的編譯錯誤是因爲你沒有一個空的構造函數。按照當前的代碼,爲了實例化'FrmProcessOrder',你必須提供一個ListBox的實例。

+0

我已經更新了代碼並添加了一些解釋以使其更加清晰。 – JuniorLinq

相關問題