2014-01-30 61 views
0

我正在處理庫存軟件。在此軟件中,當用戶按下Ctrl +空格鍵時,系統將打開一個表單(frmProducts.cs),顯示所有產品列表。在此表單上,用戶可以按名稱搜索產品,從此表單中選擇產品,然後按按鈕選擇。所選產品將隨產品代碼一起顯示在銷售發票產品名稱文本框中。防止一個表單打開兩次,同時傳遞一些數據

現在問題發生在用戶選擇產品程序時會打開新的銷售發票表單並且不會將數據加載到舊的表單中。該程序應該顯示已填好的數據已打開的表單。

我寫打開產品信息的代碼是:

private void txtProductCode1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Control && e.KeyCode == Keys.Space) 
      { 
       // frm4.Instance.Show(); 
       frmProducts cs = new frmProducts(); 
       cs.Show(); 
      } 
     } 

我對frmProducts寫道選擇按鈕的代碼是:

int ItemNo; 
       string sql; 

       if (lvProducts.SelectedItems.Count == 0) 
       { 
        MessageBox.Show("Please Select Atleast one Column", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
       } 

       else 
       { 
        ItemNo = Convert.ToInt32(lvProducts.SelectedItems[0].Text.ToString()); 

        sql = ""; 
        sql += "SELECT * FROM ProductLog WHERE ProductLog.ItemNo = " + ItemNo + ""; 


        SqlConnection cn = new SqlConnection(); 
        SqlCommand rs = new SqlCommand(); 
        SqlDataReader sdr = null; 
        clsConnection clsCon = new clsConnection(); 


        clsCon.fnc_ConnectToDB(ref cn); 


        rs.Connection = cn; 
        rs.CommandText = sql; 
        sdr = rs.ExecuteReader(); 

        this.Close(); 


        frmSaleInvoice frm = new frmSaleInvoice(ref sdr); 
        frm.ShowDialog();     

        sdr.Close(); 
        rs = null; 
        cn.Close(); 
       } 

,並在frminvoice捕捉數據代碼:

public frmSaleInvoice(ref SqlDataReader sdr) 
    { 

     InitializeComponent(); 

      while (sdr.Read()) 
      { 
       txtProductCode1.Text = Convert.ToString(sdr["ProductCode"]); 
      }    
    }   

我也試過這個代碼上的選擇按鈕,但它只是不加載任何東西到薩爾Ë發票:

frmSaleInvoice frm = new frmSaleInvoice(ref sdr); 
        if (frm.Visible) 
        { 
         frm.BringToFront(); 
        } 

,也曾經嘗試這樣做

  frmSaleInvoice frm = new frmSaleInvoice(ref sdr); 
      frmSaleInvoice.Instance.Show(); 

我也試圖與frmSaleInvoice.Instance.Show();傳遞價值,但它不會讓我傳似frmSaleInvoice.Instance.Show(ref sdr);

數據請幫我,我我真的陷入了困境。

  • 要麼告訴我如何可以傳遞價值thoguh例如
  • 或任何其他方式做到這一點?

任何建議將不勝感激。

回答

1

創建一個像我創建的公共類fnc_selectbtncCode(); frmProducts中的數據使用你的數據庫連接形成和加載數據到這個類中,僅僅因爲它是公開的,你也可以訪問其它類,並且可以使用它的數據或者只是用戶單例方法就像Zeeshan一樣建議

//使用你已經使用已經

InitializeComponent(); 

     while (sdr.Read()) 
     { 
      txtProductCode1.Text = Convert.ToString(sdr["ProductCode"]); 
     }    
} 

,並在表格2中的數據,你已經裝載了它的Load事件相同的構造,其加載到公共類

私人無效txtProductCode1_KeyDown(對象發件人,發送KeyEventArgs E) { if(e.Control & & e.KeyCode == Keys.Space) {

 if (e.Control && e.KeyCode == Keys.Space) 
     { 
      int a; 

      frmProducts cs = new frmProducts(); 
      cs.ShowDialog(); 

      a = cs.fnc_selectbtncCode(); 

      txtProductCode1.Text = Convert.ToString(a); 
     } 
    } 
    if (e.KeyCode == Keys.Enter) 
    { 
     txtQty.Focus(); 
    }   
} 

和的函數 「fnc_selectbtncCode」 在frmProducts的代碼是:

public int fnc_selectbtncCode() 
      {    

       if (lvProducts.SelectedItems.Count == 0) 
       { 
        MessageBox.Show("Please Select Atleast one Column", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
        return 0; 
       } 

       else 
       { 
        ItemNo = Convert.ToInt32(lvProducts.SelectedItems[0].Text.ToString()); 
        return ItemNo; 
       } 

      } 
+1

謝謝兄弟,非常簡單解決方案...非常感謝:) –

1

只需遵循單例方法。

以發票形式創建一個類似loadData(parameter)的公共函數。 然後當loadData被稱爲填充發票形式與新數據

//使用此構造用於第一次 公共frmSaleInvoice(參照SqlDataReader的SDR) {

InitializeComponent(); 

     while (sdr.Read()) 
     { 
      txtProductCode1.Text = Convert.ToString(sdr["ProductCode"]); 
     }    
} 

爲第二或任何其他時間使用

public void LoadData(ref SqlDataReader sdr) 
     { 

       while (sdr.Read()) 
       { 
        txtProductCode1.Text = Convert.ToString(sdr["ProductCode"]); 
       }    
       Activate(); 
     } 
+0

可以提供一些實例BRO ??或者你可以更新我的代碼,我會從中學習 –

1

我想你誤解了如何將數據從子窗體傳播到它的父窗口。 如何實現你想要的功能(如果我正確理解你的)有很多方法。我將概述其中的兩個: 首先,讓我們定義 - 您的frmSaleInvoice是您的父窗體,並且在Ctrl + Space之後顯示的窗體是子窗體。

1)對話框的方式: 更改方法,顯示像這樣的孩子:

private void txtProductCode1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Control && e.KeyCode == Keys.Space) 
      { 
       frmProducts cs = new frmProducts(); 
       if (cs.ShowDialog() == DialogResult.OK) 
       { 
        //it says you that user didn't cancel child form without selecting item 
        //parent form is frozen until user finishes his selecting on child form 
        //you have to create some public property in child form which you fill after 
        //user clicks on Select then you can do following: 
        this.MyTextbox.Text = cs.SomePropertyIveCreatedToHoldData; 
       } 

      } 
     } 

2)隨着活動: 第二種方法是使用事件,但我認爲這是很複雜的方式再ShowDialog的。此外,事件還可讓您使此過程不凍結您的父表單(這在所有情況下都不是有利的),它適用於您希望讓用戶在父表單處於活動狀態時使用父表單進行操作的情況。當你遇到這個問題時,你首先應該嘗試使用ShowDialog方法,然後決定是否要使用事件,因爲如何實現這種功能真的非常複雜。