使用SP从两个表单插入数据

多重

成员
已加入
2020年5月24日
留言内容
7
编程经验
1-3
嗨,大家好。
我试图将数据从两种形式(winform)插入SQL。表单1包含一些文本框和一个datagridview,而Form2包含两个文本框。当用户单击按钮时"btnform2",窗体2已打开,但窗体1仍保持打开状态。现在我想当用户单击按钮save(form2)时,要从两种形式保存到sql中的数据。
我创建了一个班
C#:
public class arka_data
{
public int NR { get; set; }
public int BARKODI { get; set; }
public string EMERTIMI { get; set; }
public int SASIA { get; set; }
public float CMIMI { get; set; }
public float TVSH { get; set; }
public float TOTAL { get; set; }
public float NENTOTALI { get; set; }
public float ZBRITJA { get; set; }
public float TOTALI { get; set; }
public DateTime KOHA { get; set; }
public string KASIERI { get; set; }
public string KLIENTI { get; set; }
public float VLERAETVSH { get; set; }
public float VLERAPATVSH { get; set; }
public int NRATIKUJVE { get; set; }
public float TOTALIPCS { get; set; }
            public float VLERATVSHTOTAL { get; set; }
        }
以及使用上层阶级收集数据的方法
C#:
   public void mbushe(string[] args)
{
for (int i = 0; i < dataTable.Rows.Count; i++)
{
arka_data ad = new arka_data();
ad.NR = int.Parse(txtnrfatures.Text);
ad.VLERATVSHTOTAL = float.Parse(textBox1.Text);
ad.BARKODI = int.Parse(dataTable.Rows[0].ToString());
ad.SASIA = int.Parse(dataTable.Rows[2].ToString());
ad.CMIMI = int.Parse(dataTable.Rows[3].ToString());
ad.TVSH = int.Parse(dataTable.Rows[4].ToString());
ad.NENTOTALI = float.Parse(txttotali.Text);
ad.ZBRITJA = float.Parse(txtzbritja.Text);
ad.TOTALI = float.Parse(totali.Text);
ad.KOHA = DateTime.Now;
ad.KASIERI = lbluser.Text;
ad.KLIENTI = cmbklienti.Text;
ad.VLERAETVSH = float.Parse(dataTable.Rows[7].ToString());
ad.VLERAPATVSH = float.Parse(dataTable.Rows[6].ToString());
ad.NRATIKUJVE = int.Parse(lblnumri.Text);
ad.TOTALIPCS = float.Parse(dataTable.Rows[5].ToString());
//and finally
                    Program.dta.Add(ad);
                }
            }
但是在表格2中,没有传递来自表格1的数据。
我用来存储数据的代码

C#:
  private void button1_Click(object sender, EventArgs e)
        {
            arka_data ad = new arka_data();
string faturimi = "Metoda e pagesese" + " "+ "KESH;" +"Paguar"+ txtpaguar.Text + " "+ "Kusuri"+ textBox3.Text;
con.Open();
SqlCommand cmd = new SqlCommand("insertfaturimi", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@nrfatures", ad.NR));
cmd.Parameters.Add(new SqlParameter("@klienti", ad.KLIENTI));
cmd.Parameters.Add(new SqlParameter("@pagesa", faturimi));
cmd.Parameters.Add(new SqlParameter("@nentotali", ad.NENTOTALI));
cmd.Parameters.Add(new SqlParameter("@zbritje", ad.ZBRITJA));
cmd.Parameters.Add(new SqlParameter("@totali", ad.TOTALI));
cmd.Parameters.Add(new SqlParameter("@vleratvsh", ad.VLERATVSHTOTAL));
cmd.Parameters.Add(new SqlParameter("@nrartikujve", ad.NRATIKUJVE));
cmd.Parameters.Add(new SqlParameter("@kasieri", ad.KASIERI));
cmd.Parameters.Add(new SqlParameter("@koha", DateTime.Now));
cmd.Parameters.Add(new SqlParameter("@barkodi", ad.BARKODI));
cmd.Parameters.Add(new SqlParameter("@emertimi", ad.EMERTIMI));
cmd.Parameters.Add(new SqlParameter("@sasia", ad.SASIA));
cmd.Parameters.Add(new SqlParameter("@tvsh", ad.TVSH));
cmd.Parameters.Add(new SqlParameter("@cmimi", ad.CMIMI));
cmd.Parameters.Add(new SqlParameter("@totalipcs", ad.TOTALIPCS));
cmd.Parameters.Add(new SqlParameter("@vlerapatvshpcs", ad.VLERAPATVSH));
cmd.Parameters.Add(new SqlParameter("@vleraetvshpcs", ad.VLERAETVSH));
cmd.ExecuteNonQuery();
}

如果有人可以帮助我解决我缺少的地方,那将无法使代码正常工作。
谢谢大家!
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,538
地点
弗吉尼亚州切萨皮克
编程经验
10+
在我看来,问题的一部分在于OP正在以经典的WinForms样式编写代码,其中View(例如Forms控件)在其中 是个 模型,而不是视图,只能反映模型的状态。如果进行了这种分离,它将与使用构造函数依赖项注入的以下伪代码一样简单:

C#:
class Program
{
    public static void Main()
    {
        var dataModel = new DataModel();
        Application.Run(new MainForm(dataModel));
    }
}

class MainForm : Form
{
    DataModel _dataModel;

    public MainForm(DataModel dataModel)
    {
         _dataModel = dataModel;
    }

    protected override void Load(EventArgs e)
    {
        CopyDataModelToFormControls();
    }

    void btnOpenChildForm_Click(object sender, EventArgs e)
    {
        CopyFormControlsToDataModel();

        var childForm = new ChildForm(_dataModel);
        childForm.ShowDialog();
    }

    void CopyDataModelToFormControls()
    {
        :
    }

    void CopyFormControlsToDataModel()
    {
        :
    }
}

class ChildForm : Form
{
    DataModel _dataModel;

    public ChildForm(DataModel dataModel)
    {
         _dataModel = dataModel;
    }

    protected override void Load(EventArgs e)
    {
        CopyDataModelToFormControls();
    }

    void btnSave_Click(object sender, EventArgs e)
    {
        CopyFromControlsToDataModel();

        DataAccessLayer.Save(_dataModel);    
    }

    void CopyDataModelToFormControls()
    {
        :
    }

    void CopyFormControlsToDataModel()
    {
        :
    }
}

请注意,如果您决定使用构造函数依赖项注入,则Windows Forms Designer将非常​​适合您,因为它从来没有考虑过面向现代的对象编程(例如,没有构造函数依赖项注入,没有继承等)。如果您已嫁给WinForms设计器,请使用属性依赖注入而不是构造函数依赖注入。
 

多重

成员
已加入
2020年5月24日
留言内容
7
编程经验
1-3
我也忘记在问题上放一行代码。在方法mbushe的末尾是一行代码:Program.dta.Add(ad)。 dta是在Program.cs上声明的静态列表
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
是的,应该在插入完成后关闭
然后,我建议您以错误的方式来对待这个问题。一般而言,两个对象不应都彼此了解。表单几乎总是如此。在这种情况下,您的第二种形式应该对第一种形式一无所知。第二种形式应该完成一项工作:收集用户输入并使之可用。这意味着它应该具有公开属性,可以公开 文字框 这就是它的全部。可能看起来像这样:
C#:
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public string TextBox1Text => textBox1.Text;

        public string TextBox2Text => textBox2.Text;
    }
}
Form1 然后负责其他所有事情。当它需要来自 Form2,它将创建一个实例并通过调用将其显示 显示对话框。对话结束后, 显示对话框 返回和 Form1 可以获取这些属性值,并将它们与来自其自身控件的数据一起传递给数据库。 Form2 既不知道也不在乎这些数据的目的。
 

多重

成员
已加入
2020年5月24日
留言内容
7
编程经验
1-3
然后,我建议您以错误的方式来对待这个问题。一般而言,两个对象不应都彼此了解。表单几乎总是如此。在这种情况下,您的第二种形式应该对第一种形式一无所知。第二种形式应该完成一项工作:收集用户输入并使之可用。这意味着它应该具有公开属性,可以公开 文字框 这就是它的全部。可能看起来像这样:
C#:
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public string TextBox1Text => textBox1.Text;

        public string TextBox2Text => textBox2.Text;
    }
}
Form1 然后负责其他所有事情。当它需要来自 Form2,它将创建一个实例并通过调用将其显示 显示对话框。对话结束后, 显示对话框 返回和 Form1 可以获取这些属性值,并将它们与来自其自身控件的数据一起传递给数据库。 Form2 既不知道也不在乎这些数据的目的。
我可以使用类来处理来自form2的数据,还是可以以何种方式处理这些数据。再次的Thnkas!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
不知道为什么需要额外的课程。从属性中获取数据 Form2 与从控件上的属性获取数据相同 Form1。如果愿意,您当然可以使用额外的类,但是如果您还没有这样做的话 Form1 那你到底在想什么呢?如果你想拥有 Form1 创建一个传递给的对象 Form2 通过属性或构造函数,然后 Form2 填充,继续前进。 Form2 仍然没有具体的依赖 Form1 如果这样做,则不会产生紧密耦合。
 

多重

成员
已加入
2020年5月24日
留言内容
7
编程经验
1-3
不知道为什么需要额外的课程。从属性中获取数据 Form2 与从控件上的属性获取数据相同 Form1。如果愿意,您当然可以使用额外的类,但是如果您还没有这样做的话 Form1 那你到底在想什么呢?如果你想拥有 Form1 创建一个传递给的对象 Form2 通过属性或构造函数,然后 Form2 填充,继续前进。 Form2 仍然没有具体的依赖 Form1 如果这样做,则不会产生紧密耦合。
我考虑使用类的原因是因为我正在考虑在表格1和表格2之间创建一个中间表格。该中间表格将对用户(卖方)选择付款方式(信用卡或信用卡)非常有用,并取决于有关选择将打开。例如,如果卖方选择现金,则form_cash将在卖方提供详细信息(已付款,找零等)的地方打开。因此,也许该类可以保存付款数据,并在插入过程中在表格1上使用这些数据
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
第一种形式管理整个事情。第一种形式显示选择付款方式的第二种形式。第一个表单从第二个表单获取付款方式,然后根据该付款方式打开第三个表单。然后,第一种形式从第三种形式获取数据,然后适当地保存数据。
 
最佳 底部