• WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决


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

    一、问题

    WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI

    clipboard

    代码如下:

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

  • 相关阅读:
    关于软工文档规范性——国标文档
    关于游戏平衡性——王者荣耀野怪数值参考
    单元测试特性标签(结合代码)
    常用标签梳理
    图片文件的转换、加载及缩放显示
    认识ManualResetEvent
    HTML简介
    HTML基本结构
    15年,我在深圳
    为什么坚持,想一想当初
  • 原文地址:https://www.cnblogs.com/herbertchina/p/5842345.html
Copyright © 2020-2023  润新知