如何从Click事件方法获取变量并在DrawRow方法中使用
解决棋盘绘制中的参数传递问题
我来帮你梳理下当前代码里的核心问题,以及对应的解决办法:
核心问题解析
- DrawRow方法定义语法错误:你写的
public void DrawRow(ToolStripMenuItemDrawBoard_Click(boardSize))完全不符合C#方法定义规则,方法参数需要明确指定类型,而不是直接写事件方法名。 - 局部变量传递逻辑缺失:
boardSize是ToolStripMenuItemDrawBoard_Click里的局部变量,你只需要在调用DrawRow时把它作为参数传入即可,不需要在方法定义里做特殊处理。 - 条件判断逻辑反转:你写的
if (boardSize > MIN_BOARD_SIZE || boardSize < MAX_BOARD_SIZE)逻辑错误,应该是boardSize >= MIN_BOARD_SIZE && boardSize <= MAX_BOARD_SIZE(假设MIN是2、MAX是10),否则会把合法尺寸排除在外。 - 方块位置未正确维护:
positionX和positionY如果不是类级别的字段,每次调用DrawSquare时位置不会更新,所有方块都会重叠在同一个位置。
修正后的完整代码片段
首先在类级别定义必要的字段(假设你的类是WinForm窗体):
// 类级别的字段,控制方块位置和样式 private int positionX = 0; private int positionY = 0; private const int WIDTH = 50; // 方块宽度 private const int HEIGHT = 50; // 方块高度 private const int MIN_BOARD_SIZE = 2; private const int MAX_BOARD_SIZE = 10; private readonly Pen penBlack = new Pen(Color.Black); private readonly Brush brDarkBrown = new SolidBrush(Color.SaddleBrown); private readonly Brush brLightBrown = new SolidBrush(Color.Wheat);
然后修正点击事件方法:
private void ToolStripMenuItemDrawBoard_Click(object sender, EventArgs e) { try { int boardSize = int.Parse(ToolStripTextBoxBoardSize.Text); // 修正条件判断,只允许2-10之间的尺寸 if (boardSize >= MIN_BOARD_SIZE && boardSize <= MAX_BOARD_SIZE) { // 重置绘制位置,避免多次点击后偏移 positionX = 0; positionY = 0; // 传入boardSize参数调用DrawRow DrawRow(boardSize); } else { MessageBox.Show("请输入2-10之间的整数"); // 清空所有文本框 foreach (Control c in Controls) { if (c is TextBox) c.Text = ""; } } } catch (FormatException) { MessageBox.Show("请输入有效的数字"); } }
修正DrawRow方法:
public void DrawRow(int boardSize) { int columnNum = 0; int counter = 0; Graphics paper = pictureBoxDisplay.CreateGraphics(); // 修正循环条件:从0开始绘制到boardSize列 while (columnNum < boardSize) { DrawSquare(paper); // 交替填充颜色 if (counter % 2 == 0) paper.FillRectangle(brDarkBrown, positionX, positionY, WIDTH, HEIGHT); else paper.FillRectangle(brLightBrown, positionX, positionY, WIDTH, HEIGHT); positionX += WIDTH; // 移动到下一个方块的X位置 columnNum++; counter++; } // 一行绘制完成后,重置X位置,Y位置下移一行 positionX = 0; positionY += HEIGHT; }
修正DrawSquare方法:
public void DrawSquare(Graphics paper) { paper.DrawRectangle(penBlack, positionX, positionY, WIDTH, HEIGHT); }
额外优化建议
更规范的做法是在PictureBox的Paint事件中完成绘制逻辑,而不是直接调用CreateGraphics——因为后者绘制的内容在窗口重绘(比如最小化后恢复)时会消失。你可以把boardSize保存为类字段,点击事件中设置boardSize并调用pictureBoxDisplay.Invalidate()触发重绘,再在Paint事件里执行绘制代码。
内容的提问来源于stack exchange,提问作者Avarise
相关产品推荐
相关产品推荐

