You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Click事件方法获取变量并在DrawRow方法中使用

解决棋盘绘制中的参数传递问题

我来帮你梳理下当前代码里的核心问题,以及对应的解决办法:

核心问题解析

  1. DrawRow方法定义语法错误:你写的public void DrawRow(ToolStripMenuItemDrawBoard_Click(boardSize))完全不符合C#方法定义规则,方法参数需要明确指定类型,而不是直接写事件方法名。
  2. 局部变量传递逻辑缺失:boardSize是ToolStripMenuItemDrawBoard_Click里的局部变量,你只需要在调用DrawRow时把它作为参数传入即可,不需要在方法定义里做特殊处理。
  3. 条件判断逻辑反转:你写的if (boardSize > MIN_BOARD_SIZE || boardSize < MAX_BOARD_SIZE)逻辑错误,应该是boardSize >= MIN_BOARD_SIZE && boardSize <= MAX_BOARD_SIZE(假设MIN是2、MAX是10),否则会把合法尺寸排除在外。
  4. 方块位置未正确维护: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:26