2016-06-29 43 views
1

在我的MdiForm中,我有一個菜單欄,它有btnSave對象。我想通過單擊midForm菜單欄上的btnSave來保存在我的childform中創建的數據。我有這些類將數據保存到數據庫:將多個數據和數據類型從一個子表單傳遞給父級並保存到數據庫

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(); 

但這樣做上面的代碼將創建一個新的實例並不會保存的值有積極childform被保存。如果有一種方法可以在不實例化(var addStudent = new AddStudent();)的情況下調用活動的子表單中的方法,那將非常棒。 使方法公共靜態在這種情況下不起作用。

謝謝你的幫助。

+0

,但你可以給父母內部構造器的孩子,然後做一個回調 – Thomas

+0

你是什麼意思?請詳細解釋或舉例。 – Ibanez1408

+0

在你的孩子裏面,你從你父母的類型中添加一個成員變量。那麼你會對你的孩子表現出對父母的敬意......你只需要一次這樣做,所以在構造者內部這樣做是有道理的。您還需要一個父級內部的公共方法(回調方法),您可以通過它提供您想要保存的信息。孩子現在可以通過父母的成員變量調用該方法... – Thomas

回答

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 
    } 
} 
+0

非常感謝你。現在如何將多個值傳遞給SaveStuff?如果你將在StudentBal的屬性中看到,除了字符串和int外,我還有一個字節數組「byte [] StudentImage {get; set;}」在你的例子中,它只有一個數字,而且我已經創建了它只是這個,當我有多個數據通過時Array? – Ibanez1408

+0

如果孩子有父母的尊敬,你可以用「StudentBal bal」 – Thomas

+0

代替「int number」,那麼你可以調用InsertStudent方法(parent.InsertStudent()) – Thomas

相關問題