传递一些数据时防止一个表单打开两次

时间:2014-01-30 17:22:00

标签: c# mysql .net winforms reference

我正在开发一个库存软件。在本软件中,当用户按下Ctrl + Space按钮时,系统将打开一个表单(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实例
  • 或其他任何方式?

任何建议都将不胜感激。!

3 个答案:

答案 0 :(得分:1)

只需遵循单身方法。

OR

以发票形式创建一个像loadData(参数)这样的公共函数。 然后在调用loadData时,使用新数据填写发票表单

//首次使用此构造函数 public frmSaleInvoice(ref 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();
        }  

答案 1 :(得分: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方式然后决定是否要使用事件,因为实现这个功能真的是非常复杂的方式。

答案 2 :(得分:1)

创建一个像我创建的公共类fnc_selectbtncCode(); frmProducts中的数据使用您的数据库连接形成并将数据加载到此类中,因为它是公共的,您也可以访问其他类,并且可以使用它的数据或仅使用用户单例方法就像Zeeshan建议

//使用已经使用的相同构造函数

   InitializeComponent();

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

并在表单2中加载了加载事件的数据,将其加载到公共类

private void txtProductCode1_KeyDown(object sender,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();
    }          
}

和frmProducts中的函数“fnc_selectbtncCode”的代码是:

  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;
                }

            }