如何添加具有特定文本颜色的列表框项?

时间:2017-07-12 20:31:46

标签: c# wpf listbox

我正在尝试从文本文件中将计算机列表添加到列表框中,并且根据计算机上的ping是否成功,它应该将其设置为绿色以表示成功,或者将其设置为红色以表示失败。问题是它使用所有项目上最后一台计算机的最后一种颜色。我相信这是因为Drawitem事件直到for循环完成之后才会被提升,但我想不出办法解决这个问题。任何帮助表示赞赏。 (减少ping的代码)

    private logitem linez;

    struct logitem
    {
        public string text;
        public Brush color;
    };
private void browsebutton_Click(object sender, EventArgs e)
    {
string textfile = ofd.FileName;
            if (textfile != "")
            {
                string[] lines = System.IO.File.ReadAllLines(@textfile);
                foreach (string line in lines)
                {
                    if (line != "")
                    {
                        string liner;
                        liner = line.Replace(" ", "");
                        if (ping successfull)
                        {
                        listBoxAddGreen();
                        }
                        else (ping fails)
                        {
                         listBoxAddRed();
                         }
                    }
                    changeCount();

                }
}
       public void listBoxAddGreen ()
    {
        linez.color = Brushes.Green;
        listBox1.Items.Add(linez.text);
    }
                  public void listBoxAddRed ()
    {
        linez.color = Brushes.Red;
        listBox1.Items.Add(linez.text);
    }

        private void listBox1_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush myBrush = linez.color;
        e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }

2 个答案:

答案 0 :(得分:0)

如果您愿意使用ListView控件,那就非常简单了。首先,将视图设置为List

private void Form1_Load(object sender, EventArgs e)
{
    listView1.View = View.List;
}

然后,您可以创建一个通用函数,将彩色项添加到ListView。基本上所有这一切都是先添加项目,然后使用它的索引(最后一个,或Count - 1)来改变前景:

private static void AddColoredItemToListView(ListView listView, string item, Color color)
{
    listView.Items.Add(item);
    listView.Items[listView.Items.Count - 1].ForeColor = color;
}

由于您没有使用Ping方法,因此我将在此处添加一个简单方法:

public static bool PingServer(string serverName)
{
    try { return new Ping().Send(serverName)?.Status == IPStatus.Success; }
    catch { return false; }
}

现在,要调用该方法,我们所做的只是读取我们的服务器文件,并ping每个服务器。如果对PingServer的调用返回true,我们将颜色变量设置为Green,否则我们将其设置为Red,然后我们调用上面创建的方法:

private void browsebutton_Click(object sender, EventArgs e)
{
    var serversFile = @"f:\public\temp\servers.txt";

    var servers = File.ReadAllLines(serversFile)
        .Where(l => !string.IsNullOrWhiteSpace(l))
        .Select(l => l.Replace(" ", ""));

    foreach (var server in servers)
    {
        var color = PingServer(server)
            ? Color.Green
            : Color.Red;

        AddColoredItemToListView(listView1, server, color);
    }
}

示例输出

enter image description here

或者,如果您愿意,可以改为改为BackColor

enter image description here

答案 1 :(得分:0)

我玩了一下,发现我们如何用ListBox做同样的事情。诀窍是添加一个存储颜色和文本的项目。你是用结构做的,我正在使用一个类:

class ColoredItem
{
    public string Text;
    public Color Color;
};

现在,我们可以创建彩色项目,就像我的其他答案一样,我们ping服务器并在ping成功时将颜色设置为Green,否则将其设置为{{1 }}。我们将Red属性设置为Text名称。请注意,我们现在只是直接调用server,因为我们依靠自定义绘制方法来更改颜色:

listBox1.Add(item)

现在,在我们的public static bool PingServer(string serverName) { try { return new Ping().Send(serverName)?.Status == IPStatus.Success; } catch { return false; } } private void browsebutton_Click(object sender, EventArgs e) { var serversFile = @"f:\public\temp\servers.txt"; var servers = File.ReadAllLines(serversFile) .Where(l => !string.IsNullOrWhiteSpace(l)) .Select(l => l.Replace(" ", "")); foreach (var server in servers) { var color = PingServer(server) ? Color.Green : Color.Red; ColoredItem coloredItem = new ColoredItem {Color = color, Text = server}; listBox.Items.Add(coloredItem); } } 方法中,我们尝试将项目强制转换为DrawItem类的实例。请注意,ColoredItem包含我们正在添加的项目的DrawItemEventArgs。当我们调用Index方法时,我们现在可以使用DrawString作为服务器名称,使用item.Text作为画笔颜色:

item.Color

我们需要确保的另一件事是private void listBox1_DrawItem(object sender, DrawItemEventArgs e) { var item = listBox1.Items[e.Index] as ColoredItem; if (item != null) { e.Graphics.DrawString( item.Text, e.Font, new SolidBrush(item.Color), e.Bounds); } } 的{​​{1}}设置为DrawMode,因此调用我们的自定义绘图代码:

ListBox

示例输出

enter image description here