【问题标题】:c# OOP Winforms -Pls Help /transfer listdata from form2 to form1 datagridview/without Databasec# OOP Winforms -Pls Help /transfer listdata from form2 to form1 datagridview/无数据库
【发布时间】:2017-05-09 11:38:59
【问题描述】:

我知道这是一个常见问题,我已经搜索了很长时间来寻找对我有帮助的答案。任何帮助将不胜感激 我有 2 个窗口窗体 --form1 有添加、编辑删除刷新按钮和 datagridview

当点击 form1 中的添加按钮时,form2 会弹出。这可以正常工作 form2 的输入文本框名称、年龄、城市等很少,带有保存按钮

******不使用数据库***** 我的问题是如何将 form2 上的输入数据显示到 form1 上的 datagrid 视图中。列标题数据存在但未输入列表数据 到目前为止,这是我的代码:

FORM1

    public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }
    StuAdd sa = new StuAdd();
    ListClass lc = new  ListClass();
    BindingSource bs = new BindingSource();

    private void btnAddS_Click(object sender, EventArgs e)
    {
            sa.Show();

    }

    private void btnRefreshS_Click(object sender, EventArgs e)
    {
        bs.DataSource = lc.myList;
        dgv1.DataSource = bs;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }





}

FORM2

     public partial class StuAdd : Form
    {



        public StuAdd()
        {
            InitializeComponent();


        }

        ListClass lc = new  ListClass();

        private void btnSave_Click(object sender, EventArgs e)
        {
            string title = cboTitle.SelectedItem.ToString();
            string fname = txtFname.Text;
            string lname = txtLname.Text;
            string dob = dtpDOB.Text;
            int stuId = int.Parse(txtSID.Text);
            string status = cboStatus.SelectedItem.ToString();
            string phone = txtPhone.Text;
            string email = txtEmail.Text;


            lc.AddStudent(title,fname, lname, dob,stuId,status,phone,email);

           MessageBox.Show("Data Added", "Message",        MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

            txtEmail.Clear();
            txtFname.Clear();
            txtLname.Clear();
            txtPhone.Clear();
            txtSID.Clear();
            this.Hide();


        }

        private void StuAdd_Load(object sender, EventArgs e)
        {

        }
    }
}

学生班

    class Student:Person
       {
     public int StudentID { get; set; }
     public string Status { get; set; }
     public string MyString()
     {
        StringBuilder sb = new StringBuilder();
        sb.Append(base.GetAll());
        sb.Append(" ");
        sb.Append(StudentID);
        sb.Append(" ");
        sb.Append(Status);





        return string.Format("{0} {1} {2} {3} {4} {5} {6} {7} ", Title, FirstName, Lastname, DOB, StudentID, Status, Email, Phone);
    }


}

} 人员类

    class Person
    {
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string Lastname { get; set; }
    public string DOB { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }

    public string GetAll()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(Title);
        sb.Append(" ");
        sb.Append(FirstName);
        sb.Append(" ");
        sb.Append(Lastname);
        sb.Append(" ");
        sb.Append(DOB);
        sb.Append(" ");
        sb.Append(Phone);
        sb.Append(" ");
        sb.Append(Email);
        return sb.ToString();
    }

列表类 类列表类

   {
    public List<Student> myList = new List<Student>();


    public string AddStudent(string ti, string fn, string ln, string dob,   int sid, string stat, string ph, string em)
    {
        Student s = new Student();
        s.Title = ti;
        s.FirstName = fn;
        s.Lastname = ln;
        s.DOB = dob;
        s.StudentID = sid;
        s.Status = stat;
        s.Phone = ph;
        s.Email = em;

        myList.Add(s);

        return "Student added to List";
    }

}

}

【问题讨论】:

  • 以第二种形式创建构造函数,接受datagridview的数据并做你想做的事
  • 谢谢 S 刚刚在 John 的帮助下做到了

标签: c# .net winforms datagridview


【解决方案1】:

有很多文章解释了如何做到这一点。此外,有不止一种方法可以做到这一点。但是,在 S.Petrosov 评论之后,一种可能的解决方案是将要更改的变量传递给表单 2。如果您希望第二个表单对表单 1 控件进行更改,那么您要么必须制作这些控件public 或 PASS 将要更改为第二种形式的变量。

使用发布的代码,有几件事情需要改变来实现这一点。首先,您需要确定您希望 Form 2 更改哪个控件/变量。在这种情况下,这个变量似乎是lc 变量,它似乎包含Student 对象的列表。这将起作用,但是,在表格 1 中,代码似乎也使用BindingSource 来表示DataGridView。由于 BindingSource 用作 DataSourceDataGridView 并且这是您要从表格 2 中添加新 Students 的数据源,因此此变量 bs 似乎是控件/我们要传递给表单 2 的变量。

由于这个BindingSource被用作Form 1中DataGridViewDataSource,并且我们想将此变量传递给Form 2,所以当Form 1为Loaded时可以设置这个DataSource .因此,我将这个DataSource 的设置从btnRefreshS_Click 事件移到了Form 1 的Load 事件中,如下所示:

private void Form1_Load(object sender, EventArgs e) {
  //AddExistingData?();
  bs.DataSource = lc.myList;
  dgv1.DataSource = bs;
}

现在BindingSourceDataSource 被设置为StudentsListClassmyList。然后这个BindingSource 被设置为DataSource 到Form 1 的DataGridView。除非您添加一些预先存在的数据,否则 DataGridView 最初将为空。

现在在 Form 1 中,当StuAdd 表单在btnAddS_Click 事件中初始化时,我们只需将这个BindingSource (bs) 传递给StuAdd 表单,如下所示:

private void btnAddS_Click(object sender, EventArgs e) {
  StuAdd sa = new StuAdd(bs);
  sa.Show();
}

这些是表格 1 所需的唯一更改。现在在 StuAdd 表格中,我们需要更改 StuAdd 的构造函数,以接受我们想要添加学生的父表格 BindingSourceStuAdd 表单将需要更改其签名并添加一个 BindingSource 变量,以便其他方法可以使用它。以下是上述更改。

BindingSource parentBS;  // <- variable other methods in `StuAdd` use

public StuAdd(BindingSource bs) {
  InitializeComponent();
  parentBS = bs;
}

最后,在StuAddbtnSave_Click 事件中,由于BindingSource 使用Student 对象的列表,您将需要从表单上的各种控件创建一个新的Student 对象。将新的 Student 添加到 BindingSource 时,以下代码行将不起作用,这实际上是您要添加新的 Student 的位置。

lc.AddStudent(title,fname, lname, dob,stuId,status,phone,email);

以下是对btnSave_Click 事件所做的更改,以将新学生添加到父表单BindingSource。请注意,我只是从表单控件创建了一个新的Student 对象,然后将新的Student 添加到parentBS。由于单击按钮后表单似乎隐藏/关闭......我只是关闭了表单。完成后,新的Student 数据应出现在DataGridView 的底部。应该不需要重新绑定DataGridViewbtnRefresh_Click事件确实没必要。

同样,这是实现这一目标的一种方法;还有其他可能的更好的方法来实现这一点。另一个注意事项是添加学生时似乎没有错误检查。主要是,如果用户输入字母字符或非数字的任何内容,int stuId = int.Parse(txtSID.Text); 行将崩溃。您可能想查看int.TryParse 方法。希望这会有所帮助。

private void btnSave_Click(object sender, EventArgs e) {
  string title = cboTitle.SelectedItem.ToString();
  string fname = txtFname.Text;
  string lname = txtLname.Text;
  string dob = dtpDOB.Text;
  int stuId = int.Parse(txtSID.Text);
  string status = cboStatus.SelectedItem.ToString();
  string phone = txtPhone.Text;
  string email = txtEmail.Text;
  Student newStudent = new Student();
  newStudent.Title = title;
  newStudent.FirstName = fname;
  newStudent.Lastname = lname;
  newStudent.DOB = dob;
  newStudent.StudentID = stuId;
  newStudent.Status = status;
  newStudent.Phone = phone;
  newStudent.Email = email;

  parentBS.Add(newStudent);

  MessageBox.Show("Data Added", "Message", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

  //txtEmail.Clear();
  //txtFname.Clear();
  //txtLname.Clear();
  //txtPhone.Clear();
  //txtSID.Clear();
  this.Close();
}

【讨论】:

  • 非常感谢约翰的详细回答正是我所需要的。更多的了解现在多表单发生了什么。现在工作.. dgv 正在填充!!所有最好的 G
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多