Как установить цвет переднего плана в отдельном элементе ListBox? - PullRequest
1 голос
/ 17 ноября 2011

Я играю в игру.У меня есть список пользователей (ники):

List<string> users;

Этот список используется для отображения пользователям в ListBox, звоните listaJogadores.

    public delegate void actualizaPlayersCallback(List<string> users);

    public void actualizaPlayers(List<string> users)
    {
        listaJogadores.BeginInvoke(new actualizaPlayersCallback(this.actualizarListaPlayers), new object[] { users });
    }

    public void actualizarListaPlayers(List<string> users)
    {
        listaJogadores.Items.Clear();
        for (int i = 0; i < users.Count; i++)
        {
            listaJogadores.Items.Add(users.ElementAt(i));
        }         
    }

Когда пользовательиграя, то у него есть ник в списке игр:

List<Game> games;

То, что я хочу, это когда игрок входит в игру, цвет ник-шоу в listaJogadores, должен быть красным!Когда у меня в игре только один игрок, все в порядке, все игроки видят ник этого игрока красным, но когда другой игрок идет в игру, я получаю ArgumentOutOfRangeException в инструкции string nick = tmp.players.ElementAt(i).getNick();

Это мой код ... Дайте мне несколько идей / помогите, пожалуйста!Я думаю, что проблема заключается в for(), но как я могу манипулировать всем списком без выполнения цикла?

listaJogadores.DrawMode = DrawMode.OwnerDrawFixed;

private void listaJogadores_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush textBrush = SystemBrushes.ControlText;
        Font drawFont = e.Font;

        for (int i = 0; i < games.Count; i++)
        {
            Game tmp;
            tmp = games.ElementAt(i);
            for (int j = 0; j < tmp.players.Count; j++)
            {
                string nick = tmp.players.ElementAt(i).getNick();

                if (listaJogadores.Items[e.Index].ToString() == nick)
                {
                    textBrush = Brushes.Red;//RED....
                    if ((e.State & DrawItemState.Selected) > 0)
                        drawFont = new Font(drawFont.FontFamily, drawFont.Size, FontStyle.Bold);
                }
                else if ((e.State & DrawItemState.Selected) > 0)
                {
                    textBrush = SystemBrushes.HighlightText;
                }
            }
        }
        e.Graphics.DrawString(listaJogadores.Items[e.Index].ToString(), drawFont, textBrush, e.Bounds);
    }

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Не следует помещать логику рисования внутри циклов, поскольку вы хотите определить кисть только один раз. Сначала определите, является ли предмет игроком в реальной игре. Затем нарисуйте предмет нужного цвета:

private void listaJogadores_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index >= 0 && e.Index < listaJogadores.Items.Count) {
        e.DrawBackground();
        Brush textBrush = SystemBrushes.ControlText;
        Font drawFont = e.Font;
        bool playerFound = false;
        string nick = (string)listaJogadores.Items[e.Index];
        foreach (Game game in games) {
            if (game.players.Any(p => p.getNick() == nick)) {
                playerFound = true;
                break;
            }
        }
        if (playerFound) {
            textBrush = Brushes.Red;  //RED....  
            if ((e.State & DrawItemState.Selected) > 0)
                drawFont = new Font(drawFont.FontFamily, drawFont.Size, FontStyle.Bold);
        } else if ((e.State & DrawItemState.Selected) > 0) {
            textBrush = SystemBrushes.HighlightText;
        }
        e.Graphics.DrawString(nick, drawFont, textBrush, e.Bounds);
        e.DrawFocusRectangle();
    }
}

А также проверьте, действителен ли e.Index. Это может привести к исключению «Индекс выходит за границы».

0 голосов
/ 17 ноября 2011

проверьте этот код:

private void listaJogadores_DrawItem(object sender, DrawItemEventArgs e)
{
    listaJogadores.DrawItem-=Eeventhandle(listaJogadores_DrawItem);
    .
    .
    .
    listaJogadores.DrawItem+=Eeventhandle(listaJogadores_DrawItem);
}
...