Grid中选中CheckBox获取同行列0Label时出现类型转换异常
问题分析与解决方案
异常原因
你代码里的Cast<Label>()会强制将Grid的所有子控件转换为Label类型,但Grid中同时存在CheckBox控件,当遍历到CheckBox时就会抛出类型转换异常。Cast操作是在过滤条件执行前完成的,所以哪怕你后续指定了列0和对应行,也会先触发类型转换错误。
修复方案
用OfType<Label>()替代Cast<Label>(),这个方法会自动筛选出Grid中所有Label类型的控件,不会对其他类型控件进行强制转换:
string? labelName = GrWindow.Children .OfType<Label>() .First(e => Grid.GetRow(e) == row && Grid.GetColumn(e) == 0) .Content as string;
优化建议(避免空引用异常)
如果担心存在找不到对应Label的情况,可以改用FirstOrDefault()并添加空判断,防止抛出InvalidOperationException:
Label? targetLabel = GrWindow.Children .OfType<Label>() .FirstOrDefault(e => Grid.GetRow(e) == row && Grid.GetColumn(e) == 0); string? labelName = targetLabel?.Content as string;
调试方法
如果想确认Grid子控件的情况,可以在OnSelection方法中添加遍历代码,打印所有控件的类型和行列信息,排查是否有异常控件:
foreach (var child in GrWindow.Children) { Debug.WriteLine($"控件类型: {child.GetType().Name}, 行: {Grid.GetRow(child)}, 列: {Grid.GetColumn(child)}"); }
内容的提问来源于stack exchange,提问作者Barreto
相关产品推荐
相关产品推荐

