1

フォームの上部に次のものがあります。

string[] data;
Color []color;

コンストラクターで:

color = new Color[1] { Color.Red};

次に、コンストラクターにロードする関数があります。

private void ListBoxLoadKeys(Dictionary<string,List<string>> dictionary, 
    string FileName)
{
    string line = System.String.Empty;
    using (StreamReader sr = new StreamReader(keywords))
    {
        while ((line = sr.ReadLine()) != null)
        {
            int i = line.Count();
            tokens = line.Split(',');
            dictionary.Add(tokens[0], tokens.Skip(1).ToList());
            // listBox1.Items.Add("Url: " + tokens[0] + " --- " 
                + "Localy KeyWord: " + tokens[1]);     
            data = new string[1] { "Url: " + tokens[0] + " --- " 
                + "Localy KeyWord: " + tokens[1]};
            listBox1.DataSource = data;
        }           
    }        
}

しかし、ListBoxに追加するのは1行だけです。listbox1.Items.Add のようにしてから、テキスト ファイルのすべての行を listBox に追加します。

次に、線を赤で着色します。

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawFocusRectangle();
    e.Graphics.DrawString(data[e.Index], new Font(FontFamily.GenericSansSerif, 8,
        FontStyle.Regular),new SolidBrush(color[e.Index]), e.Bounds);
}

private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = 16;
}
  1. Items.Add を使用する代わりに DataSource を使用して StreamReader からすべての行を追加するにはどうすればよいですか?

  2. 「Url:」という単語だけを赤で色付けするにはどうすればよいですか?次の行があります:

    data = new string[1] { "Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]};

そして、テキストファイルのすべての行を追加し、各行に「Url:」という単語だけに色を付けたい

4

2 に答える 2

2

まず、すべての行を読み取り、データを入力してから、それをListBoxコントロールにバインドする必要があります。テキストの行数がわからないため、配列ではなくリストをお勧めします。そのためのコードは次のとおりです。

List<string> data = new List<string>();
private void ListBoxLoadKeys(Dictionary<string,List<string>> dictionary, string FileName)
        {

               string line = System.String.Empty;

               using (StreamReader sr = new StreamReader(keywords))
               {
                   while ((line = sr.ReadLine()) != null)
                   {
                       int i = line.Count();
                       tokens = line.Split(',');
                       dictionary.Add(tokens[0], tokens.Skip(1).ToList());
                      // listBox1.Items.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);
                       data.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);

                   }
               }
               listBox1.DataSource = data;
}

質問の他の部分については、常に同じ単語「Url:」を描画しているため、次のようにコードを変更できます。

編集:これは私が短時間で得ることができる最高のものです。これがあなたが探しているものであることを願っています。コントロールを自分で描画するのは難しいビジネスであり、WinFormsとGDI+の両方で多くの経験が必要であることを忘れないでください。あなたの投稿から、あなたは初心者であると結論付けることができますので、気をつけてください。学ぶべきことがたくさんあります。アイテムの二重バッファ描画を作成したので、ちらつきが発生せず、新しい再描画でアイテムが大胆になることはありません。それにもかかわらず、これは最適なコードではありませんが、それはあなたの目的のためのトリックを行います。リストボックスで選択したアイテムを描画する必要がある場合は、このリンクを確認することをお勧めします。その場合、状態に応じて、Clear異なる色のビットマップを使用できるため、アイテムの背景色を変更できます。

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index >= 0 && e.Index < data.Count)
        {
            e.DrawFocusRectangle();
            Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
            Graphics g = Graphics.FromImage(bmp);
            g.Clear(listView1.BackColor);
            string url = data[e.Index].Substring(0, 4);
            Font f = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);
            SizeF size = e.Graphics.MeasureString(url, f);
            RectangleF urlRectF = new RectangleF(e.Bounds.X, 0, size.Width, e.Bounds.Height);
            g.DrawString(url, f, new SolidBrush(Color.Red), urlRectF); 
            RectangleF restRectF = new RectangleF(e.Bounds.X + size.Width, 0, e.Bounds.Width - size.Width, e.Bounds.Height);
            g.DrawString(data[e.Index].Substring(4), f, new SolidBrush(Color.Green), restRectF);
            e.Graphics.DrawImage(bmp,e.Bounds);
            g.Dispose();
        }
    }
于 2012-10-17T14:44:10.700 に答える
0

whileループの外側にデータソースを設定します。または、このようにリストボックスにアイテムを追加します

listBox1.Items.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);
于 2012-10-17T14:45:35.797 に答える