背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助!
一、问题
WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI
代码如下:
using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.IO; using System.Windows.Forms; namespace WindowsFormsApplication1 { public delegate T BorrowReader<out T>(IDataReader reader); public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private List<User> GetUsers(IDataReader reader) { var list = new List<User>(); while (reader.Read()) { list.Add(new User() { ID = reader.GetInt32(reader.GetOrdinal("ID")), UserName = reader.GetString(reader.GetOrdinal("UserName")), NickName = reader.GetString(reader.GetOrdinal("NickName")), Phone = reader.GetString(reader.GetOrdinal("Phone")), QQ = reader.GetString(reader.GetOrdinal("QQ")), }); } return list; } private void btnTest_Click(object sender, EventArgs e) { dataGridView1.AutoGenerateColumns = false; var list = MyDb.LendReader("select * from Users where 0=0", GetUsers); dataGridView1.DataSource = list; } } public class User { public int ID; public string UserName; public string NickName; public string Phone; public string QQ; } public class MyDb { public static T LendReader<T>(string sql, BorrowReader<T> borrowReader) { using (OleDbConnection connection = CreateConnection()) { connection.Open(); OleDbCommand c = new OleDbCommand(sql, connection); OleDbDataReader r = c.ExecuteReader(); return borrowReader(r); } } private static OleDbConnection CreateConnection() { string dbName = Path.Combine(Application.StartupPath, "MyData.mdb"); OleDbConnection c = new OleDbConnection { ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName }; return c; } } }
二、解决方法
其实很简单,只是很多朋友可能没有考虑到,因为这压根不是什么泛型List或者ArrayList的问题,
只要改代码:
public class User { public int ID; public string UserName; public string NickName; public string Phone; public string QQ; }
为:
public class User { public int ID{ get; set; } public string UserName { get; set; } public string NickName { get; set; } public string Phone { get; set; } public string QQ { get; set; } }
就好了
三、简单讲解
没定义get、set的是字段,定义了就是属性了,为了安全性考虑,DataGridView 的数据源绑定只能是被公开了的属性,而无权访问字段。很多其他控件也有同样的情况。