10

How to configure Foreground Color in a single ListBox item?

 3 years ago
source link: https://www.codesd.com/item/how-to-configure-foreground-color-in-a-single-listbox-item.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

How to configure Foreground Color in a single ListBox item?

advertisements

I'm doing a game. I have a list of users (nicks):

List<string> users;

This list is used to show to the users on a ListBox, call 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));
        }
    }

When a user is playing, then it have is nick on the list of games:

List<Game> games;

What I want is when a player enter in a game, the color of is nick show in listaJogadores, must be Red! When I have only one player in a game, everything is ok, all the players see the nick of that player in red, but when another player go to a game, then I get an ArgumentOutOfRangeException in the instruction string nick = tmp.players.ElementAt(i).getNick();

This is my code... Give me some ideas/help please! I think that the problem is the for(), but how can I manipulate an entire list without doing a loop?

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


You should not put drawing logic inside of the loops, since you want to define the brush only once. First determine if the item is a player in a actual game. Then draw the item in the right color:

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();
    }
}

And also test if e.Index is valid. This might cause your "Index is out of bounds" Exception.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK