Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#形式,属性不起作用?_C#_Winforms_Properties_Boolean - Fatal编程技术网

C#形式,属性不起作用?

C#形式,属性不起作用?,c#,winforms,properties,boolean,C#,Winforms,Properties,Boolean,我正在尝试为PC制作流行游戏“Ruzzle”,请参见: 我陷入了一个非常愚蠢的错误,我想,但出于某种原因,它看起来像是一个属性不工作 我有一个名为“check”的类,它有一个名为Used的bool属性。如果设置为true,背景将从白色变为橙色。这是通过以下方式实现的: bool _used; public bool Used { get { return _used; } set { _used = value; Invalidate(); } } void Check_

我正在尝试为PC制作流行游戏“Ruzzle”,请参见:

我陷入了一个非常愚蠢的错误,我想,但出于某种原因,它看起来像是一个属性不工作

我有一个名为“check”的类,它有一个名为
Used
的bool属性。如果设置为true,背景将从白色变为橙色。这是通过以下方式实现的:

bool _used; 

public bool Used
{
    get { return _used; }
    set { _used = value; Invalidate(); }
}

void Check_Paint(object sender, PaintEventArgs e)
{
    Graphics area = e.Graphics;

    if (_used==false)
    {
        area.FillRectangle(Brushes.White, 0, 0, Width - 1, Height - 1);
        ...
    }
    else
    {
        area.FillRectangle(Brushes.Orange, 0, 0, Width - 1, Height - 1);
        ...
    }
}
我已经为
mouseClick
分配了一个我将在类
Ruzzle
中定义的事件。 类
Ruzzle
处理游戏,它基本上是一个
Check
的二维数组

public event EventHandler selected;

//in the constructor I've put this
this.MouseClick += new MouseEventHandler(Check_MouseClick);
最后

void Check_MouseClick(object sender, MouseEventArgs e)
{
    if (selected != null)
    {
        selected(this, e);
    }                

    Invalidate();
}
在类
Ruzzle
中,我尝试通过执行以下操作来更改
Check
对象的bool属性:

public Ruzzle(Control father)
{ 
    myGame = new Check[4, 4];

    for (int i = 0; i < 4; i++)
    {
        for(int j=0;j<4;j++)
        {          
            myGame[i, j] = new Check(50, father,i,j);
            myGame[i, j].Location = new Point((i * 50), (j * 50));
            father.Controls.Add(myGame[i, j]);
            myGame[i, j].selected += new EventHandler(Ruzzle_selected);
        }
    }       
}

void Ruzzle_selected(object sender, EventArgs e)
{
    int r = (sender as Check).Row;
    int c = (sender as Check).Column;
    myGame[r, c].Used = true;
}
public Ruzzle(控制父亲)
{ 
myGame=新支票[4,4];
对于(int i=0;i<4;i++)
{

对于(int j=0;j我会将此作为答案发布,尽管这篇文章不会告诉您代码的确切问题。代码本身看起来很好,因此您必须对其进行调试。让我给您一些有关如何调试此问题的提示

我可以看到两种明显的可能情况,为什么您的
Used
属性为
false

  • 未正确地将其更改为
    true

  • 它在某个点被重置回
    false

  • 因此,您必须检查这两种可能性。首先,我们应该忽略所有
    check
    实例,但单击的实例除外,否则其他实例可能会在调试时分散您的注意力。有两种简单的方法:

  • 仅实例化一个实例。在这种情况下,如果游戏中可能的话,您应该创建一个1x1字段

  • 调试时区分距离。VS debugger中有一个很好的功能,名为。基本上,它允许您在调试时为某个对象分配一个数字唯一标识符。稍后,您可以通过在debugger中观察特定实例的Id来确定该实例是否是您以前标记的实例。如果您以前没有使用过此功能,请查看上面的链接

  • 好的,现在您只调试了
    Check
    类的一个实例。让我们从检查属性设置是否正确开始。有几点您应该检查属性值,例如:

  • 在有条件的地方绘制处理程序

  • 调用
    Invalidate
    方法时使用的
    属性的设置器。
    \u Used
    应明确为
    true

  • Ruzzle\u的末尾选择了
    处理程序。
    使用的
    属性应该是
    true
    ,您应该在这里检查它。如果它是
    true
    ,那么我们可以得出结论,至少它设置正确

  • 现在,让我们检查属性
    Used
    是否没有重置回
    false
    。据我所知,在您的代码中,您应该没有实际需要重置它的位置。这意味着,如果您发现这样的行为,那么它可能就是您正在查找的错误。我假设您没有访问您所使用的
    \co除
    Used
    属性之外的任何位置都可以使用de>字段。在这种情况下,调试这个可能的问题非常容易,您只需在属性的setter中放置一个断点,然后查看它是否设置为
    false
    。为了避免在将断点设置为
    true
    时命中断点,您可以使用该功能。在您的情况下,condi选项应该类似于
    value==false&&u used==true


    请尝试使用这些步骤进行调试,并让我们知道它是否对您有帮助。否则可能是我遗漏了什么,在这种情况下,我将扩展答案。

    虽然它可能无法解决您的问题,但请删除
    myGame[r,c].Invalidate();
    。不需要它,因为设置
    Used
    已经调用了
    Invalidate()
    。您是否对其进行了调试,以确定所使用的属性设置程序是否真正被调用?出于某种原因,在它执行“myGame[r,c].used=true”之后说明它直接进入绘制方法..所以不,它没有被调用。Wierd.你认为prolem是什么?非常感谢!你是如何确定值没有改变的?