绑定List<T>后DataGridView单元格为空,如何解决?
解决List绑定DataGridView后单元格显示NULL的问题
问题核心原因:DataGridView数据绑定默认仅识别属性(Property),你定义的LogEntry类中,TimeStamp和Message是公共字段(Field)而非属性,导致网格无法读取这些值,最终单元格显示NULL。
解决方法:
将LogEntry类中的字段改为带get/set访问器的属性:
public partial class MainForm : Form { private class LogEntry { // 改为属性,添加get/set访问器 public DateTime TimeStamp { get; set; } public string Message { get; set; } } List<LogEntry> _logEntries = new List<LogEntry>(); // 修正原代码拼写错误:EentArgs → EventArgs private void MainForm_Load(object sender, EventArgs e) { grid1.DataSource = _logEntries; } public void AddCommItem(string msg) { _logEntries.Add(new LogEntry { TimeStamp = DateTime.Now, Message = msg }); // List<T>不支持自动通知数据变化,添加后需手动刷新网格 grid1.Refresh(); // 若要实现自动刷新,建议改用BindingSource: // 先声明成员:private BindingSource _bindingSource = new BindingSource(); // 在MainForm_Load中:_bindingSource.DataSource = _logEntries; grid1.DataSource = _bindingSource; // 添加数据时:_bindingSource.Add(new LogEntry { TimeStamp = DateTime.Now, Message = msg }); // 此方式无需手动调用Refresh } }
额外提示:
- 原代码中
EentArgs属于拼写错误,需修正为EventArgs才能正常编译。 - 若需要添加数据后网格自动更新,优先使用
BindingSource作为数据绑定中间层——因为List<T>未实现INotifyCollectionChanged接口,无法主动通知网格数据变更,而BindingSource内置了该接口的实现。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

