C# 从列表中添加项目到列表框

C# add item to listbox from list

当按下快捷键时,一个值被添加到列表中并传递到列表框以添加一个项目。但是,如果使用AddRange(RecentColors.ToArray(),不仅会添加新的列表项,而且会不断添加。如果将新值添加到列表值,是否可以只将该新值添加到列表框?

 private void mainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.C)
        {
            RecentColors.Add(hexToRGB(hexcode.Text));
            for(int i = 0; i < RecentColors.Count; i++)
            {
                color_list.Items.AddRange(RecentColors.ToArray());
            }
        }
    }

Capture1

Capture2

当我添加一项时,我无法更改已添加的格式..

这里是 AddRange 的定义:

Adds the elements of the specified collection to the end of the List<T>.

(source).

我可能误解了您在这里尝试做的事情,但您在每次调用 for 循环时都添加了整个“RecentColors”序列。

问题是您有包含所有项目的 RecentColors,并且每次按键都会将所有项目添加到列表框中。尝试在 RecentColors 和列表框中添加一个元素:

var item = hexToRGB(hexcode.Text);
RecentColors.Add(item);
color_list.Items.Add(item);

更新

好的,首先我们要为 ListBox 和 ComboBox 项目创建一个 class。

public class ComboBoxItem
{
    public bool Rgb { get; set; }

    public override string ToString()
    {
        // Text to show in ComboBox
        return this.Rgb ? "RGB" : "HTML";
    }
}

public class ListBoxItem
{
    public bool Rgb { get; set; }

    public Color Color { get; set; }

    public override string ToString()
    {
        // Text to show in ListBox
        return this.Rgb ?
            $"{this.Color.R},{this.Color.G},{this.Color.B}" :
            $"{this.Color.R:X2}{this.Color.G:X2}{this.Color.B:X2}";
    }
}

这些控件中的每一项都是这些 classes 的对象。将项目添加到 ComboBox:

this.comboBox1.Items.Add(new ComboBoxItem { Rgb = true });
this.comboBox1.Items.Add(new ComboBoxItem { Rgb = false });

当您需要向列表框添加项目时:

this.listBox1.Items.Add(
    new ListBoxItem { Rgb = true, Color = Color.Red });

现在,当您在 ComboBox 中的 RGB 和 HTML 之间切换时,您会得到选定的 ComboBox 项目以了解何时以 RGB 或 HTML 显示颜色。然后,迭代所有 ListBox 项并使用该值设置 RGB。在这种形式中,ListBox 项将以该模式绘制文本。 ListBox 不知道您的项目发生了变化:您必须强制重绘项目。

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var comboBoxItem = (ComboBoxItem)this.comboBox1.SelectedItem;
    for (int i = 0; i < this.listBox1.Items.Count; i++)
    {
        var item = (ListBoxItem)this.listBox1.Items[i];
        item.Rgb = comboBoxItem.Rgb;

        // To force redraw
        listBox1.Items[i] = listBox1.Items[i];
    }
}