【问题标题】:Pass multiple data and datatype from a childform to a parent and save to database将多个数据和数据类型从子窗体传递给父窗体并保存到数据库
【发布时间】:2016-06-29 05:50:35
【问题描述】:

在我的 MdiForm 中,我有一个带有 btnSave 的菜单栏。我想通过单击 midForm 菜单栏上的 btnSave 来保存在我的子窗体中创建的数据。我有这些类来将数据保存到数据库中:

StudentBal.cs

internal class StudentBal
{
    public string DateAdded { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string CityAddress { get; set; }
    public string HomeAddress { get; set; }
    public string Nationality { get; set; }
    public string MaritalStatus { get; set; }
    public string DateOfBirth { get; set; }
    public string PlaceOfBirth { get; set; }
    public string TelNo { get; set; }
    public string Father { get; set; }
    public string Mother { get; set; }
    public string ParentsAddress { get; set; }
    public string EmployersName { get; set; }
    public string EmplyerTelNo { get; set; }
    public string GuardiansName { get; set; }
    public string GuradiansAddress { get; set; }
    public byte[] StudentImage { get; set; }
    public string WorkAddress { get; set; }

    public int InsertStudent(StudentBal bal)
    {
        var dal = new StudentDal();
       return dal.InsertStudent(bal);
    }

StudentDal.cs

public int InsertStudent(StudentBal bal)
    {
        const string query =
            @"INSERT INTO students VALUES(@DateAdded, @FirstName, @MiddleName, @LastName, @CityAddress, @HomeAddress, @Nationality,
                                @MaritalStatus, @DateOfBirth, @PlaceOfBirth, @TelNo, @Father, @Mother, 
                                @ParentsAddress, @EmployersName, @EmployersTelNo, @GuardiansName, 
                                @GuardiansAddress, @StudentImage, @WorkAddress)";
        using (_cmd = new SqlCommand(query, _cn))
        {
            _cmd.Parameters.AddWithValue("@DateAdded", Convert.ToDateTime(bal.DateAdded).ToShortDateString());
            _cmd.Parameters.AddWithValue("@FirstName", bal.FirstName);
            _cmd.Parameters.AddWithValue("@MiddleName", bal.MiddleName);
            _cmd.Parameters.AddWithValue("@LastName", bal.LastName);
            _cmd.Parameters.AddWithValue("@CityAddress", bal.CityAddress);
            _cmd.Parameters.AddWithValue("@HomeAddress", bal.HomeAddress);
            _cmd.Parameters.AddWithValue("@Nationality", bal.Nationality);
            _cmd.Parameters.AddWithValue("@MaritalStatus", bal.MaritalStatus);
            _cmd.Parameters.AddWithValue("@DateOfBirth", bal.DateOfBirth);
            _cmd.Parameters.AddWithValue("@PlaceOfBirth", bal.PlaceOfBirth);
            _cmd.Parameters.AddWithValue("@TelNo", bal.TelNo);
            _cmd.Parameters.AddWithValue("@Father", bal.Father);
            _cmd.Parameters.AddWithValue("@Mother", bal.Mother);
            _cmd.Parameters.AddWithValue("@ParentsAddress", bal.ParentsAddress);
            _cmd.Parameters.AddWithValue("@EmployersName", bal.EmployersName);
            _cmd.Parameters.AddWithValue("@EmployersTelNo", bal.EmplyerTelNo);
            _cmd.Parameters.AddWithValue("@GuardiansName", bal.GuardiansName);
            _cmd.Parameters.AddWithValue("@GuardiansAddress", bal.GuradiansAddress);
            _cmd.Parameters.AddWithValue("@StudentImage", bal.StudentImage);
            _cmd.Parameters.AddWithValue("@WorkAddress", bal.WorkAddress);
            _cn.Open();
            return(_cmd.ExecuteNonQuery());
        }
    }

这是在我的 AddStudent 表格中

 private void btnSaveInformation_Click(object sender, EventArgs e)
    {
        var stream = new MemoryStream();
        pictureBox2.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        byte[] pic = stream.ToArray();
        if (!CheckTextBox()) return;
        var bal = new StudentBal
        {
            CityAddress = string.IsNullOrWhiteSpace(txtCityAddress.Text) ? "N/A" : txtCityAddress.Text,
            DateAdded = DateTime.Now.ToShortDateString(),
            DateOfBirth = txtDateOfBirth.Text,
            EmployersName = string.IsNullOrWhiteSpace(txtEmployersName.Text) ? "N/A" : txtEmployersName.Text,
            EmplyerTelNo = string.IsNullOrWhiteSpace(txtEmpContactNumber.Text) ? "N/A" : txtEmpContactNumber.Text,
            Father = string.IsNullOrWhiteSpace(txtFathersName.Text) ? "N/A" : txtFathersName.Text,
            FirstName = txtFirstName.Text,
            GuardiansName = string.IsNullOrWhiteSpace(txtGuardiansName.Text) ? "N/A" : txtGuardiansName.Text,
            GuradiansAddress = string.IsNullOrWhiteSpace(txtGuardiansAddress.Text) ? "N/A" : txtGuardiansAddress.Text,
            HomeAddress = txtHomeAddress.Text,
            LastName = txtLastName.Text,
            MaritalStatus = txtMaritalStatus.Text,
            MiddleName = string.IsNullOrWhiteSpace(txtMiddleName.Text) ? "N/A" : txtMiddleName.Text,
            Mother = txtMothersName.Text,
            Nationality = txtNationality.Text,
            ParentsAddress = txtParentsAddress.Text,
            PlaceOfBirth = txtPlaceOfBirth.Text,
            TelNo = string.IsNullOrWhiteSpace(txtTelNo.Text) ? "N/A" : txtTelNo.Text,
            StudentImage = pic,
            WorkAddress = string.IsNullOrWhiteSpace(txtWorkAddress.Text) ? "N/A" : txtWorkAddress.Text, 
        };
        var result = bal.InsertStudent(bal);
        if (result > 0)
        {
            MessageBox.Show(@"Data successfully added.");
        }
        var obj = (MdiForm)Application.OpenForms["MdiForm"];
        if (obj != null) obj.FillComboBox(); 
    }

我需要将我的子表单(AddStudent)中的所有信息传递给父表单(MdiFOrm),这样我就可以通过单击菜单栏中的 btnSave 来保存所有详细信息。我尝试创建一个可以在父表单中调用的公共方法(SaveDetails()),如下所示:

AddStudent add = new AddStudent();
add.SaveDetails();

但是执行上面的代码将创建一个新实例,并且不会保存具有要保存的值的活动子窗体。如果有一种方法可以在不实例化的情况下调用活动子窗体中的方法 (var addStudent = new AddStudent();),那就太好了。 在这种情况下,将方法设为 public static 是行不通的。

感谢您的帮助。

【问题讨论】:

  • 但是你可以在contructor里面将父级交给子级,然后进行回调
  • 什么意思?请多解释或举个例子。
  • 在您的孩子中,您可以从父母的类型中添加一个成员变量。然后你对你的孩子表示敬意......你只需要这样做一次,所以在构造函数内部这样做是有意义的。您还需要在您的父级(回调方法)中提供一个公共方法,您可以将它提供给您要保存的信息。孩子现在可以通过父母的成员变量调用该方法...
  • 还是我没听懂问题?
  • 旁注:在写入插入语句时始终指定列名。否则一旦添加一列,您的应用程序就会崩溃。

标签: c#


【解决方案1】:

这是执行回调的抽象示例:

public class Parent
{
    public void CreateChild()
    {
        Child childNew = new Child(this); //here you give over the parents reverence
    }

    public void SaveStuff(int number)
    {
        //here you can save the number
    }
}


class Child
{
    private Parent parent;
    public Child(Parent parent)
    {
        this.parent = parent;
    }

    public void PressOkButton()
    {
        this.parent.SaveStuff(4); //here you are doing the callback
    }
}

【讨论】:

  • S谢谢。现在如何将多个值传递给 SaveStuff?如果您将在 StudentBal 的属性中看到,除了字符串和 int 之外,我还有一个 Byte "byte[] StudentImage {get; set;} 数组。在您的示例中,它只有一个数字,我已经做了它可以工作。当我有多个数据要传递时,就是这个。数组?
  • 您可以将“int number”替换为“StudentBal bal”
  • 如果孩子对父母有敬意,那么可以用(parent.InsertStudent())调用InsertStudent方法
  • 哦!我得到它!谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多