在以前做过的项目里,我都是用 DataGridView.DataSource 直接赋值为 IList<> 类型的实例,完全没有问题。可是今天做的一个例子突然不能这样用了,比如我下面的代码和运行结果截图:
我把 IList<int> 类型的集合绑定到 dgv_1,就没有任何显示;
我把 IList<string> 类型的集合绑定到dgv_3,显示的居然是字符串的长度;
其他 dgv_4,dgv_5 绑定后都没有任何显示
只有把 dataTable 作为数据源绑定显示正常。说明一下:
1)我可以保证,每个绑定到DataGridView的集合,其内部元素的值都是正确的,这个我在运行时全部用断点看过,就在对.dataSource赋值以后就出问题了;
2)我以前从没见过这种情况,对比以前的代码,我的用法没有任何改变。这是运行结果截图这是代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dgv_1.RowHeadersVisible = false;
dgv_2.RowHeadersVisible = false;
dgv_3.RowHeadersVisible = false;
dgv_4.RowHeadersVisible = false;
} private void btn_BindIList_Click(object sender , EventArgs e)
{
//将IList<int>绑定到dgv_1
IList<int> intList = new List<int>();
intList.Add(1);
intList.Add(99);
dgv_1.DataSource = intList; //将Table绑定到dgv_2
DataTable dt = new DataTable();
dt.Columns.Add();
dt.Rows.Add(1);
dt.Rows.Add(99);
dgv_2.DataSource = dt; //将IList<String>绑定到dgv_3
IList<String> strList = new List<String>();
strList.Add("1");
strList.Add("99");
dgv_3.DataSource = strList; //将IList<MyString>绑定到dgv_4,MyString是一个包含一个string成员变量的类
IList<MyString> myStrList = new List<MyString>();
myStrList.Add(new MyString("1"));
myStrList.Add(new MyString("99"));
dgv_4.DataSource = myStrList; //将IList<MyStringInt>绑定到dgv_5,MyStringInt是一个包含一个string和一个int成员变量的类
IList<MyStringInt> myStrIntList = new List<MyStringInt>();
myStrIntList.Add(new MyStringInt("1" , 1));
myStrIntList.Add(new MyStringInt("99" , 99));
dgv_5.DataSource = myStrIntList;
dgv_2.Columns[0].Width = dgv_2.Width - 3;
dgv_3.Columns[0].Width = dgv_3.Width - 3;
//dgv_4.Columns[0].Width = dgv_4.Width - 3;
//dgv_3.Columns[0].Width = dgv_3.Width - 3;
}
}public class MyString
{
public string str;
public MyString(string str)
{
this.str = str;
}
}public class MyStringInt
{
public string str;
public int i;
public MyStringInt(string str , int i)
{
this.str = str;
this.i = i;
}
}

解决方案 »

  1.   

    http://www.tinybbs.cn/csharp/post/id~42198
    参考这个,和你问题相似
      

  2.   

     //将IList<int>绑定到dgv_1
            IList<int> intList = new List<int>();
            intList.Add(1);
            intList.Add(99);
            dgv_1.DataSource = intList;
            dgv_1.DataBind(); //here
      

  3.   

    是不是要设置DataGridView的什么属性呀
      

  4.   

    问题出在:各类成员没有定义成属性,如:
     public float Str
              {
                  get { return this.str  ; }
                  set { this.str = value; }
              }
    构造函数应给成员变量对应的属性赋值,如:
    public MyStringInt(string str )
        {
            this.Str = str;
    }
    加上以类为数据源的应该没问题;
      

  5.   

    另:int或string类型不能直接以Ilist做为数据源,解决方法加多一个集合变量做辅助,如下面的第2、4行
    var test = new List<int> {1,2, 3 };
    dataGridView1.DataSource = (from s in test select new { s }).ToList();
      var test = new List<string> { "just", "a", "test" };
     dataGridView2.DataSource = (from s in test select new { s }).ToList();