背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助!

一、问题

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 的数据源绑定只能是被公开了的属性,而无权访问字段。很多其他控件也有同样的情况。

最新文章

  1. Qt Creator pro 文件 导入vs2013碰到的问题
  2. 作业3(PSP表格)
  3. Spring容器中的Bean
  4. 为什么在我眼里你是一只傻逼——傻逼“常所用”句型之(2)——“当当网的就有XXX人评论,YYY%的推荐”
  5. hdu 2061
  6. NDK(6)eclipse下断点调试ndk代码
  7. PowerShell官方的MSDN
  8. ASP.NET 依赖注入。
  9. Java 并发 线程属性
  10. css 相关算法
  11. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)
  12. NOIP2017Day1题解
  13. Boost - 从Coroutine2 到Fiber
  14. Centos 7.6配置nginx反向代理负载均衡集群
  15. Gin框架初识
  16. Python 增强类库
  17. BSGS 算法
  18. basename、dirname、alias、date
  19. JS-构造函数2
  20. linux yum 下载至本地及使用本地缓存安装包

热门文章

  1. 状态压缩dp增量统计贡献——cf1238E(好题)
  2. js文字转语音(speechSynthesis)
  3. fiddler对浏览器、app抓包及证书安装
  4. 文件下载java代码
  5. python excel单元格及样式
  6. Hyperledger:名词解释
  7. Java中equals和hashcode的区别?
  8. 简单三层BP神经网络学习算法的推导
  9. fedora 28 winscp链接不上
  10. JS自运行函数的写法和MVVM框架数据驱动的底层逻辑