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];
}
}
当按下快捷键时,一个值被添加到列表中并传递到列表框以添加一个项目。但是,如果使用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];
}
}