定义学生类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GridViewDemo { public class Student { //姓名字段 private string Name; //姓名属性 public string name { get { return Name; } set { Name = value; } } //得分字段 private double Score; //得分属性 public double score { get { return Score; } set { Score = value; } } } }
form1代码实现:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.VisualBasic; namespace GridViewDemo { public partial class Form1 : Form { //定义全局对象 public static List<Student> studentList = new List<Student>();//用于form1和form2传值的第二种方法 DataTable dt = new DataTable(); public Student studentOne = new Student(); public Form1() { InitializeComponent(); } #region 创建集合类实现建立并存放20个学生的方法,类似于创建班级类。 private List<Student> GeneraStudent() { List<Student> banji = new List<Student>() ; //用循环真正去创建20个学生 for (int i=1; i<16;i++) { Student student = new Student(); //创建学生姓名 student.name = "student"+i; //用随机数创建学生得分 Random rad = new Random(); System.Threading.Thread.Sleep(100); student.score =Convert.ToDouble( Convert.ToDouble(rad.Next(101) + (0.5 * (i % 2))).ToString("000.0")); //把创建的学生姓名和得分放入学生列表集合对象 banji.Add(student); } //返回方法生成的20个学生列表集合 return banji; } private Student GeneraOneStudent() { Student student = new Student(); Random rad = new Random(); //创建学生姓名 student.name = "student_add" + rad.Next (1,100); //用随机数创建学生得分 //student.score = Convert.ToDouble(rad.Next(101)); student.score = Convert.ToDouble(Convert.ToDouble(rad.Next(101) + (0.5 * (rad.Next(0,10) % 2))).ToString("000.0")); //把创建的学生姓名和得分放入学生列表集合对象 return student; } #endregion #region 绑定到学生列表集合(班级)到DataGridView表格控件 private void bangdingstudentOnGridView(int flag) { if (flag == 0)//标志位0表示首次绑定控件 { //表格清空初始化 this.dgv_Students.Rows.Clear(); this.dgv_Students.Columns.Clear(); //实例化表格 dt = new DataTable(); //实例化每列 并初始化列名称和列数据类型 DataColumn dc = new DataColumn(); dc.ColumnName = "Name"; dt.Columns.Add(dc); DataColumn dcvalue = new DataColumn(); dcvalue.ColumnName = "Score"; dt.Columns.Add(dcvalue); //调用创建学生方法,创建20个学生。 studentList = this.GeneraStudent(); //把创建的20个学生用循环方法加载到每行 foreach (Student student in studentList ) { //实例化表格行 并加载创建出的学生信息 DataRow dr = dt.NewRow(); dr["Name"] = student.name; dr["Score"] = student.score; dt.Rows.Add(dr); } //把数据绑定到表格控件数据源 this.dgv_Students.DataSource = dt; DataGridViewLinkColumn dlc = new DataGridViewLinkColumn(); dlc.Name = "Delete"; dlc.Text = "Delete"; this.dgv_Students.Columns.AddRange(new DataGridViewColumn[] { dlc }); DataGridViewButtonColumn adc = new DataGridViewButtonColumn(); adc.Name = "Add"; adc.Text = "Add"; this.dgv_Students.Columns.AddRange(new DataGridViewColumn[] { adc }); DataGridViewButtonColumn udc = new DataGridViewButtonColumn(); udc.Name = "Update"; udc.Text = "Update"; this.dgv_Students.Columns.AddRange(new DataGridViewColumn[] { udc }); foreach (DataGridViewRow dr in this.dgv_Students.Rows) { dr.Cells[2].Value = "Delete"; dr.Cells[3].Value = "Add"; dr.Cells[4].Value = "Update"; } } else if (flag == 1) { //表格清空初始化 dt.Rows.Clear(); //把创建的学生用循环方法加载到每行 foreach (Student student in studentList) { //实例化表格行 并加载创建出的学生信息 DataRow dr = dt.NewRow(); dr["Name"] = student.name; dr["Score"] = student.score; dt.Rows.Add(dr); } //把数据绑定到表格控件数据源 this.dgv_Students.DataSource = dt; foreach (DataGridViewRow dr in this.dgv_Students.Rows) { dr.Cells[2].Value = "Delete"; dr.Cells[3].Value = "Add"; dr.Cells[4].Value = "Update"; } } } #endregion private void Form1_Load(object sender, EventArgs e) { this.bangdingstudentOnGridView(0); //取消datagridview控件的点击排序功能 第一行需特殊处理 //必须表格产生后才能使用此段代码 for (int i=0;i < this.dgv_Students.Columns.Count; i++) { this.dgv_Students.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; //this.dgv_Students.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; } } private void dgv_Students_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 2 && e.RowIndex >= 0)//实现删除功能 { //获取选中行的数据 string strStudentName = this.dgv_Students.Rows[e.RowIndex].Cells[0].Value.ToString(); foreach (Student st in studentList ) { if(st.name.Equals(strStudentName)) { //删除 studentList.Remove(st); this.bangdingstudentOnGridView(1); return; } } //MessageBox.Show("无匹配的学生"); } else if(e.ColumnIndex == 3 && e.RowIndex >= 0)//实现添加功能 { Form2 f2 = new Form2();//实例化弹出窗口form2对象 DialogResult dr = f2.ShowDialog(this.Owner);//实现form2窗口弹出方法,并指定父窗体 if (dr == DialogResult.OK)//判断点击是否是确定按钮 { //第一种传值方式 通过定义类的static类型对象 //this.bangdingstudentOnGridView(1); //第二种传值方式 通过定义类的public对象以及相关的字段和属性 this.studentOne = f2.student; studentList.Add(this.studentOne); this.bangdingstudentOnGridView(1); } else if(dr == DialogResult.Cancel)//判断点击是否是取消按钮 { } } else if(e.ColumnIndex == 4 && e.RowIndex>=0)//实现修改功能 { //获取选中行的数据 string strStudentName = this.dgv_Students.Rows[e.RowIndex].Cells[0].Value.ToString(); Double douStudentScore = Convert.ToDouble(this.dgv_Students.Rows[e.RowIndex].Cells[1].Value.ToString()); Form2 f2 = new Form2(strStudentName, douStudentScore); DialogResult dr = f2.ShowDialog(this.Owner); if (dr == DialogResult.OK)//判断点击是否是确定按钮 { this.studentOne = f2.student;//弹窗form2中输入的值传给form1对象 //在对象列表中定位获取的学生名,找到后更改相关值,并跳出循环 foreach (Student st in studentList) { if(st.name==strStudentName ) { st.name = this.studentOne.name; st.score = this.studentOne.score; break; } } this.bangdingstudentOnGridView(1);//调用表格生成方法 } else if (dr == DialogResult.Cancel)//判断点击是否是取消按钮 { } } } } }
弹窗form2代码实现:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Resources.ResXFileRef; namespace GridViewDemo { public partial class Form2 : Form { public Form2() { InitializeComponent(); } //定义带参数的构造函数用于传值 public Form2 (string name,double score) { InitializeComponent(); this.txt_name.Text = name; this.nud_score.Value = (decimal)score; } //定义字段属性 用于传值第二种方法 public Student Student; public Student student { get; set; } private void bt_ok_Click(object sender, EventArgs e) { //第一种传值方式 通过定义类的static类型对象 //Student st = new Student(); //st.name = this.txt_name.Text.Trim(); //st.score = Convert.ToDouble(this.nud_score.Value.ToString("0.0")); //Form1.studentList.Add(st); //this.Close(); //第二种传值方式 通过定义类的public对象以及相关的字段和属性 //Student studnet = new Student(); student = new Student(); student.name = this.txt_name.Text.Trim();//获取form2窗口控件输入的值并给属性赋值 student.score = Convert.ToDouble(this.nud_score.Value.ToString("0.0"));//获取form2窗口控件输入的值并给属性赋值 this.Close(); } } }