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

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/Raywang80s/p/6895527.html
Copyright © 2011-2022 走看看