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

  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/herbertchina/p/5842345.html
Copyright © 2011-2022 走看看