2017-07-12 9 views
0

コンピュータのリストをテキストファイルからリストボックスに追加しようとしています。コンピュータ上でpingが成功するかどうかに基づいて、成功すると緑色に、失敗すると赤色に色付けする必要があります。問題は、すべてのアイテムの最後のコンピュータの最後の色を使用することです。これは、forループが完了するまでDrawitemイベントが発生しないためだと思いますが、これを回避する方法は考えられません。どんな助けもありがとうございます。あなたがListViewコントロールを使用してに開放している場合は(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

あなたは 'ListView'を使用していますか?色を変更するのは簡単です。 –

+0

描画モードを 'OwnerDrawnFixed'に設定しましたか? –

+0

あなたは** MVVMに精通していなければなりません。それを使用して、あなたの仕事は数分間解決されます。 1)ビューモデルでpingを実行する。 2)すべてのpingされたアイテムは、pingが成功したかどうかを示す 'PingOk'プロパティを持つビューモデル(例えば、' ItemVM')を持つべきです。 3) 'ListBox'の' ItemsSource'を 'ItemVM'のコレクションにバインドします。 4) 'PingOk'プロパティの値に応じて、' ListBoxItem'が 'Foreground'を変更するためのXAMLのトリガーを設定します。そして 'ListBox'は' ListView'よりもはるかにあなたの仕事に便利ですので、この項目のコントロールに固執してください。 – Maxim

答えて

0

少し遊んで、ListBoxで同じことをする方法を発見しました。トリックは、色とテキストの両方を格納するアイテムを追加することです。あなたは構造体で、私はクラスを使用していますことをやっていた:

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

、私たちはずっとに色のアイテムを作成することができます同じことが、我々は、サーバーにpingを実行してに色を設定する私の他の答え、のようでしたpingが成功した場合はGreen、それ以外の場合は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); 
    } 
} 

我々はListBoxためDrawModeに設定されていることを確認する必要がある唯一の他の事OwnerDrawFixedので、私たちのカスタムドローコードが呼び出されます:

private void Form1_Load(object sender, EventArgs e) 
{ 
    listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
} 

サンプル出力

enter image description here

+0

私は、主な問題は、ColorItemクラスにキャストして修正された私のDrawItemメソッドにあったと思います。また、コードを書いた方法ははるかに簡単でより雄弁でした。私が今すぐ把握しなければならないのは、結果をより速く表示する方法です。 (すべてのアイテムが描画前にpingされるまで待ちます) –

0

は、それは非常に簡単です。まず、Listにビューを設定します。

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

その後、あなたはListViewに色のアイテムを追加します汎用的な関数を作成することができます。私はよ、あなたはPingメソッドが含まれていなかったので

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

:基本的にこれが行うすべては前景色を変更するには、それの(最後の1になり、またはCount - 1)インデックスを使用し、その後、最初の項目を追加することです

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を変更することができます:

を210

関連する問題