WinForms中9×9GridBox行列块列表填充及IDE0059错误求助
解决数独网格控件的列表分组与数值转数组问题
1. 修复IDE0059不必要赋值错误
这个错误的核心原因是你给变量做了无意义的重复赋值——比如先初始化var myRow1List = new List<TextBox>();,之后又重新给它赋值覆盖了初始值,导致第一次的空列表赋值完全没用。
解决方式很简单:直接在初始化时完成列表填充,或者避免冗余的空赋值操作。
2. 正确构建行/列/块的分组列表
因为你用的是自定义GridBox类,建议直接用List<List<GridBox>>来存储分组(而非List<TextBox>),这样能直接访问控件的自定义属性。代码示例:
// 初始化9组行、列、块容器 List<List<GridBox>> rowGroups = new List<List<GridBox>>(); List<List<GridBox>> columnGroups = new List<List<GridBox>>(); List<List<GridBox>> blockGroups = new List<List<GridBox>>(); // 先创建9个空的子列表(对应9行、9列、9块) for (int i = 0; i < 9; i++) { rowGroups.Add(new List<GridBox>()); columnGroups.Add(new List<GridBox>()); blockGroups.Add(new List<GridBox>()); } // 遍历所有控件,按自定义属性分组 foreach (Control ctrl in this.Controls) { if (ctrl is GridBox box) { // 注意:如果你的Row/Column/Block属性是1-9的编号,要转为0基索引(0-8) int rowIdx = box.Row - 1; int colIdx = box.Column - 1; int blockIdx = box.Block - 1; rowGroups[rowIdx].Add(box); columnGroups[colIdx].Add(box); blockGroups[blockIdx].Add(box); } }
这样每个分组列表都会被实际填充和使用,不会触发IDE0059错误。
3. 将输入值转换为9×9可空整数数组
遍历所有GridBox,根据控件的行/列属性映射到数组位置,处理输入内容:
// 初始化9×9的目标数组 int?[,] sudokuArray = new int?[9, 9]; foreach (Control ctrl in this.Controls) { if (ctrl is GridBox box) { int row = box.Row - 1; int col = box.Column - 1; // 解析输入:有效数字存对应值,空/无效值存0 if (int.TryParse(box.Text, out int inputNum) && inputNum >= 1 && inputNum <= 9) { sudokuArray[row, col] = inputNum; } else { sudokuArray[row, col] = 0; } } }
如果需要用null代表空值,直接把0替换成null即可。
额外提示
- 确认
GridBox的Row/Column/Block属性取值范围(1-9或0-8),索引转换要对应,避免数组越界。 - 后续遍历行/列/块时,直接通过
rowGroups[i]就能获取第i+1行的所有控件,方便数独验证逻辑开发。
内容的提问来源于stack exchange,提问作者user28946752
相关产品推荐
相关产品推荐

