WinForms基于数组创建地图网格颜色显示异常求助
问题解决:WinForms地图网格颜色区分问题
核心问题分析
你的代码存在两个关键错误:
- 错误的数组遍历逻辑:每个
PictureBox都遍历了整个mapGrid数组,导致同一个控件的背景色被反复覆盖,最终所有控件都显示数组最后一个元素对应的颜色(橙色),还会重复将同一个控件添加到控件集合和列表中。 - 位置计算颠倒:
Point的第一个参数是水平坐标(对应列),第二个是垂直坐标(对应行),你把行索引i和列索引j搞反了,会导致网格排列错乱。
修正后的代码
namespace Test { public partial class Form1 : Form { int TILE_SIZE = 64; int MAP_NUM_ROWS = 11; int MAP_NUM_COLS = 15; List<PictureBox> items = new List<PictureBox>(); // 补充泛型类型,原代码遗漏 int[] mapGrid = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; public Form1() { InitializeComponent(); newTest(); } private void newTest() { for (var i = 0; i < MAP_NUM_ROWS; i++) // i是行索引 { for (var j = 0; j < MAP_NUM_COLS; j++) // j是列索引 { PictureBox tile = new PictureBox(); // 修正位置:X对应列j,Y对应行i tile.Location = new Point(j * TILE_SIZE, i * TILE_SIZE); tile.Height = TILE_SIZE; tile.Width = TILE_SIZE; tile.BorderStyle = BorderStyle.FixedSingle; // 通过行和列计算数组索引,直接获取对应的值 int gridValue = mapGrid[i * MAP_NUM_COLS + j]; tile.BackColor = gridValue == 0 ? Color.Red : Color.Orange; items.Add(tile); this.Controls.Add(tile); } } } } }
关键改动说明
- 移除错误的foreach循环:直接通过
i * MAP_NUM_COLS + j计算当前网格在mapGrid中的索引,一次性获取对应的值设置颜色,避免重复覆盖。 - 修正控件位置计算:将
Location的X坐标设为j * TILE_SIZE(列方向),Y坐标设为i * TILE_SIZE(行方向),保证网格按正确的行列排列。 - 补充泛型类型:原代码中
List items未指定泛型,改为List<PictureBox> items,符合C#语法规范。 - 优化控件命名:将
Walls改为tile,更符合语义,避免误解。
内容的提问来源于stack exchange,提问作者SuckatCSharp
相关产品推荐
相关产品推荐

