使用Linq IEnumerable Except后,DataGridView无法正常显示文本的问题
解决DataGridView绑定string集合显示异常的问题
问题原因
DataGridView默认会尝试绑定对象的公共属性,而string类型没有可供绑定的公共属性(仅包含内部方法和字段),直接绑定List<string>时,控件无法识别要显示的内容,因此出现显示异常。
解决方案
方法1:将字符串包装为带属性的对象(推荐)
把每个字符串包装成匿名类型或自定义类,让DataGridView有明确的绑定属性:
var dataA = new HashSet<string>(); var dataB = new HashSet<string>(); // 简化对称差计算(比原Linq写法更高效) var symmetricDiff = new HashSet<string>(dataA); symmetricDiff.SymmetricExceptWith(dataB); // 包装为匿名类型后绑定 dgv_B.DataSource = symmetricDiff.Select(s => new { 差异文本 = s }).ToList();
绑定后DataGridView会自动生成列,显示差异文本列的内容,也可手动调整列标题和样式。
方法2:手动添加列与行
如果不想包装对象,可直接给DataGridView添加列并插入行数据:
var dataA = new HashSet<string>(); var dataB = new HashSet<string>(); var symmetricDiff = new HashSet<string>(dataA); symmetricDiff.SymmetricExceptWith(dataB); // 清空原有列 dgv_B.Columns.Clear(); // 添加自定义列 var textColumn = new DataGridViewTextBoxColumn { HeaderText = "差异内容", Width = 200 }; dgv_B.Columns.Add(textColumn); // 插入数据行 foreach (var str in symmetricDiff) { dgv_B.Rows.Add(str); }
方法3:通过事件处理列内容(适用于已有列的场景)
如果已在设计器中添加列,可通过CellFormatting事件手动赋值:
var dataA = new HashSet<string>(); var dataB = new HashSet<string>(); var symmetricDiff = new HashSet<string>(dataA); symmetricDiff.SymmetricExceptWith(dataB); // 假设设计器中已有名为colContent的列 dgv_B.Columns["colContent"].DataPropertyName = ""; dgv_B.DataSource = symmetricDiff.ToList(); // 绑定CellFormatting事件 dgv_B.CellFormatting += (sender, e) => { if (e.Value != null) { e.Value = e.Value.ToString(); e.FormattingApplied = true; } };
代码优化提示
原Linq写法可替换为HashSet自带的SymmetricExceptWith方法,该方法直接修改集合计算对称差,性能优于Except+Union,避免多次遍历集合。
内容的提问来源于stack exchange,提问作者Rafael Suazo
相关产品推荐
相关产品推荐

