Не удалось обновить интерфейс ... (winforms) - PullRequest
0 голосов
/ 24 марта 2011
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 ]

1 голос
/ 24 марта 2011

Отмена элементов управления, безусловно, помогла бы, но я не уверен на 100%, что вы обновляете один и тот же экземпляр класса.

Лучше было бы сохранить два строковых значения внутри вашего класса ChessBoard (возможно,PlayerAText и PlayerBText), которые вы обновите вместо этого.

Затем, предполагая, что 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;
1 голос
/ 24 марта 2011

Отладьте ваш код и посмотрите, все ли упомянутые вами функции вызваны.

Проверьте, не пытаетесь ли вы обновить значения из потока, не являющегося пользовательским интерфейсом.

0 голосов
/ 24 марта 2011

Вы фактически ничего не меняете

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";
}

Вы должны изменить метки A и B внутри, если оба блока оба

0 голосов
/ 24 марта 2011

Какими элементами управления являются PlayerA и PlayerB?Если они являются элементами управления System.Windows.Forms.Label, попробуйте вызвать Invalidate () после установки текста:

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

Это заставит метку перерисовываться.

...