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 一行中。我希望它像 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. 如何添加 StreamReader 中的所有行而不是使用 Items.Add 但使用 DataSource ?

  2. 我怎样才能只用红色着色“Url:”这个词我有这一行:

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

我希望它添加文本文件中的所有行,并且每行只为单词“Url:”着色

4

2 回答 2

2

首先,您应该读取所​​有行并填充数据,然后将其绑定到 ListBox 控件。我建议使用 List 而不是 Array,因为您不知道您将拥有多少行文本。这是代码:

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 回答