如何在C#中通过OOP方式实现DataGridView数据加载
核心问题说明
你当前的get方法仅在方法内部读取了数据库字段值,没有将数据返回给外部调用方,因此窗体侧无法拿到查询结果,自然无法填充到DataGridView控件中。以下是可直接落地的修改方案:
方案1:用实体集合传递数据(符合OOP设计思想)
步骤1:定义学生实体类存储单条数据
// 专门用来存储学生单条记录的实体类 public class Student { public string StName { get; set; } public string Nic { get; set; } }
步骤2:修改数据操作类的get方法,返回数据集合
public class StdDbHelper { // 方法返回值修改为List<Student>集合,存储所有查询到的学生数据 public List<Student> GetAllStudents() { List<Student> studentList = new List<Student>(); // 使用using包裹数据库连接,代码执行完会自动释放连接,不需要手动写Close using (SqlConnection con = new SqlConnection("server =.; initial catalog=testdb; User ID=sa; Password=123")) { string sql = "select * from std"; con.Open(); SqlCommand cm = new SqlCommand(sql, con); SqlDataReader dr = cm.ExecuteReader(); while (dr.Read()) { Student stu = new Student(); stu.StName = dr["st_name"].ToString(); stu.Nic = dr["nic"].ToString(); studentList.Add(stu); } } return studentList; } }
步骤3:窗体侧绑定数据到DataGridView
有两种绑定方式可选:
方式A:自动绑定(最简便)
提前给DataGridView的每一列设置DataPropertyName属性,对应实体类的属性名:姓名列设为StName,Nic列设为Nic,之后直接赋值数据源即可:
StdDbHelper ss = new StdDbHelper(); List<Student> stuList = ss.GetAllStudents(); dataGridView1.DataSource = stuList;
方式B:手动添加行(适合自定义行逻辑的场景)
StdDbHelper ss = new StdDbHelper(); List<Student> stuList = ss.GetAllStudents(); dataGridView1.Rows.Clear(); foreach (var stu in stuList) { // 参数顺序和DataGridView列的顺序保持一致即可 dataGridView1.Rows.Add(stu.StName, stu.Nic); }
方案2:用DataTable传递数据(无需定义实体,适合快速实现)
如果不想额外写实体类,也可以直接用DataTable承载查询结果:
修改数据操作类方法
public DataTable GetAllStudentTable() { DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection("server =.; initial catalog=testdb; User ID=sa; Password=123")) { string sql = "select * from std"; SqlDataAdapter sda = new SqlDataAdapter(sql, con); // 自动完成连接打开、查询、填充、连接关闭的全流程 sda.Fill(dt); } return dt; }
窗体绑定代码
StdDbHelper ss = new StdDbHelper(); dataGridView1.DataSource = ss.GetAllStudentTable();
内容的提问来源于stack exchange,提问作者kobi udemy
相关产品推荐
相关产品推荐

