如何在某些行中向ListBox添加相同的字符串?

时间:2012-10-17 14:29:31

标签: c# winforms listbox

在表格的顶部我有:

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. 如何使用Items.Add添加StreamReader中的所有行,但使用DataSource?

  2. 如何在红色中只显示“Url:”这个词我有这一行:

      

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

  3. 我想让它添加文本文件中的所有行,每行只为单词“Url:”添加颜色

2 个答案:

答案 0 :(得分: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 +的经验。从你的帖子我可以得出结论,你是一个初学者,所以要小心,有很多东西需要学习。我对这些项目进行了双缓冲绘制,因此您不会遇到任何闪烁,并且项目不会通过新的重绘更大胆。尽管如此,这不是最佳代码,但它可以满足您的需求。如果您需要在列表框中绘制选定的项目,我建议您检查link。在这种情况下,根据状态,您可以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();
        }
    }

答案 1 :(得分:0)

将数据源设置在while循环之外。或者像这样将项目添加到列表框

listBox1.Items.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);