无法更新界面...(winforms)

时间:2011-03-24 13:19:11

标签: c# winforms class label partial

class2
{
    public void ExecuteAll(int rowStart,int columnStart,int rowEnd,int columnEnd)
    {
        ChessBoard chess = new ChessBoard();
        chess.YourTurn();
        counter++;
    }
 }

 public static int counter;

我有这个代码,我想打印哪些玩家把它变成棋盘。计数器是一个静态int,每次执行时,计数器都会增加1。

YourTurn是名为ChessBoard的分部类中的一种方法。它看起来像这样:

public  void YourTurn()
{
    if (Class2.counter % 2 == 0)// if counter is an equal number
    {
        PlayerA.Text = "Black turn";// PlayerA label 
        PlayerA.Text = "White inactive";
    }
    else
    {
        PlayerB.Text = "White turn";// PlayerB label 
        PlayerB.Text = "Black inactive";
    }
}

什么不会发生,是标签的更新,每次我移动。那是为什么?


即使这样的设计也不会起作用,这意味着,不是因为每次都创建了一个新的实例。

       public static string whitesTurn = "White turn";
    public static string blacksTurn = "Black turn";
    public  void YourTurn()
    {
        if (Class2.counter % 2 == 0)
        {
            PlayerA.Text = blacksTurn;
            PlayerA.Text = "White inactive";
            PlayerA.Invalidate();

        }
        else
        {
            PlayerB.Text = whitesTurn;
            PlayerB.Text = "Black inactive";
            PlayerA.Invalidate();

        }
    }

4 个答案:

答案 0 :(得分:1)

调试代码,看看你提到的所有函数是否都被调用。

查看您是否尝试更新非UI线程中的值。

答案 1 :(得分:1)

使控件无效肯定会有所帮助,但我并不是100%肯定你正在更新同一个类的实例。

更好的设计是将两个字符串值保留在您更新的ChessBoard类(可能是PlayerATextPlayerBText)中。

然后,假设class1是你的WinForm,你可以添加几个部分:

class2
{
  public void ExecuteAll(int rowStart,int columnStart,int rowEnd,int columnEnd)
  {
    ChessBoard chess = new ChessBoard();
    chess.YourTurn();
    counter++;
    PlayerA.Text = chess.PlayerAText;
    PlayerA.Text = chess.PlayerBText;
  }
}

public static int counter;

答案 2 :(得分:0)

PlayerA和PlayerB有哪些控制?如果它们是System.Windows.Forms.Label控件,请在设置文本后尝试调用Invalidate():

PlayerA.Text = "Black turn";
PlayerA.Invalidate();

这将强制重绘标签。

答案 3 :(得分:0)

你没有有效地改变任何事情

if (Class2.counter % 2 == 0)// if counter is an equal number
{
    PlayerA.Text = "Black turn";// PlayerA label 
    PlayerA.Text = "White inactive";
}
else
{
    PlayerB.Text = "White turn";// PlayerB label 
    PlayerB.Text = "Black inactive";
}

PlayerA.Text将始终为“白色无效”,而PlayerB.Text将为“黑色无效”

我认为以下内容将解决您的问题

if (Class2.counter % 2 == 0)// if counter is an equal number
{
    PlayerA.Text = "Black turn";// PlayerA label 
    PlayerB.Text = "White inactive";
}
else
{
    PlayerB.Text = "White turn";// PlayerB label 
    PlayerA.Text = "Black inactive";
}

你应该在if和else两个块中更改标签A和B