Winform DataGridView数据绑定失效:数据不显示问题求助
解决Winform DataGridView数据绑定失效的问题
我一眼就瞅到你这问题的核心了——Winform的数据绑定只认公共属性,不认字段,咱们一步步捋清楚:
问题根源
你的NeaktivniPartner类里定义的都是公共字段(比如public int ppid;),但Winform的自动列生成、TypeDescriptor.GetProperties这些数据绑定相关的机制,只会识别带get/set的公共属性(Property),不会理字段(Field)。这就导致:
- 直接绑定泛型列表时,DataGridView找不到要显示的列
- 调用
ConvertToDataTable时,获取到的属性集合是空的,生成的DataTable没有列,自然显示不出内容
解决方案
把字段改成属性就搞定了,顺便给你优化下绑定代码:
1. 修改NeaktivniPartner类
把字段改成标准的公共属性,这是最关键的一步:
public class NeaktivniPartner { public int Ppid { get; set; } public string Naziv { get; set; } public double DanaBezKupovine { get; set; } }
(首字母大写是C#编码规范,你也可以保持和原字段同名,但必须是属性形式)
2. 优化数据绑定逻辑
设置DataSource后不需要手动调用Refresh(),Winform会自动刷新UI。另外直接用BindingList<T>绑定泛型列表会更灵活(后续数据变更还能自动通知UI):
private void button1_Click(object sender, EventArgs e) { neaktivniPartneri.Clear(); // 每次点击先清空旧数据,避免重复添加 foreach(Int_String partner in partneri) { double danaBezProdaje = (DateTime.Today - Komercijalno.Partner.PoslednjaKupovina(partner._int)).TotalDays; if ( danaBezProdaje > 31) { NeaktivniPartner np = new NeaktivniPartner(); np.Ppid = partner._int; np.Naziv = partner._string; np.DanaBezKupovine = danaBezProdaje; neaktivniPartneri.Add(np); } } // 两种绑定方式选其一即可 // 方式1:直接绑定BindingList(推荐) dataGridView1.DataSource = new BindingList<NeaktivniPartner>(neaktivniPartneri); // 方式2:转DataTable(现在属性正确了,ConvertToDataTable也能生成正常的列) // dataGridView1.DataSource = M.List.ConvertToDataTable(neaktivniPartneri); }
3. 验证ConvertToDataTable的有效性
现在NeaktivniPartner是属性了,TypeDescriptor.GetProperties(typeof(T))就能正确获取到属性集合,生成的DataTable会包含3列,绑定后就能正常显示数据了。
额外小提示
你之前试的删除DataGridView、重启VS都是无用功,不过可以再确认下:
- 确保
dataGridView1.AutoGenerateColumns确实是true(你构造函数里已经设置了,没问题) - 调试时可以看生成的DataTable的
Columns.Count,之前应该是0,修改属性后会变成3,这就说明问题解决了
内容的提问来源于stack exchange,提问作者Aleksa Ristic
相关产品推荐
相关产品推荐

