在窗体程序中,定义了一个类,类中若干字段。
在窗体载入事件中定义一个list集合  (集合.Add(new 类(){ XXXXX })加载内容。 用dataGridView.DataSource显示出来 为什么类中字段必须封装?不封装dataGridView显示不了内容?

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace xuliehua
    {
        [Serializable]
        class Student
        {
            public int id { get; set; }
            public string name { get; set; }
            public int age { get; set; }      //一定要写get,set的原因不懂。
        }
    }using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace xuliehua
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            List<Student> students = new List<Student>();
            private void Form1_Load(object sender, EventArgs e)
            {
                students.Add(new Student() { id = 56, age = 14, name = "阿什顿" });
                students.Add(new Student() { id = 5, age = 5, name = "已经" });
                students.Add(new Student() { id = 9, age = 17, name = "宋德福" });
                students.Add(new Student() { id = 3, age = 19, name = "sdf卓" });
                students.Add(new Student() { id = 1, age = 16, name = "的说法卓" });
                dataGridView1.DataSource = students;     //不写get,set不能显示内容
            }
        }
    }
      

  2.   

    直接的原因是绑定程序会遍历类的属性而不会去找公有字段。更深层次的原因是公有字段根本就是不应该使用的东西,一个类只能由自己改变内部状态,这是OOP所说的封装。
      

  3.   

    一定要写get set是因为事实上c#编译器会把属性编译成getXXX setXXX 方法,如果你的属性只有get没有set那就是个只读属性 这样子做是因为属性可以包含一些验证之类的东西 而字段是没有的 并且有些属性本身是不对应任何字段的 比如我做控件的时候有些属性其实对应的是ViewState里面的东西
    数据绑定控件我没有看过源码 但是绑定的时候因为是通过给字符串表示的属性名 那么事实上是通过反射去查看元数据里面是否有这个名字的属性然后调用了getXXX方法而已