我正在尝试从文本文件中将计算机列表添加到列表框中,并且根据计算机上的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();
}
答案 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);
}
}
示例输出
或者,如果您愿意,可以改为改为BackColor
:
答案 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
示例输出