При нажатии ярлыка значение добавляется в список и передается в список для добавления элемента. Однако, если используется 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());
}
}
}
Когда я добавляю один элемент, я не могу изменить формат, который уже добавлен.





Вот определение для AddRange:
Adds the elements of the specified collection to the end of the List<T>.
(источник).
Я могу неправильно истолковать то, что вы пытаетесь здесь сделать, но вы добавляете всю последовательность «RecentColors» каждый раз, когда вызывается ваш цикл for.
Проблема в том, что у вас есть RecentColors со всеми элементами, и каждое нажатие клавиши добавляет все элементы в список. Попробуйте добавить один элемент в RecentColors, а также в список:
var item = hexToRGB(hexcode.Text);
RecentColors.Add(item);
color_list.Items.Add(item);
ОБНОВИТЬ
Хорошо, сначала мы собираемся создать класс для элементов ListBox и ComboBox.
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}";
}
}
Каждый элемент в этих элементах управления будет объектом этих классов. Добавьте элементы в ComboBox:
this.comboBox1.Items.Add(new ComboBoxItem { Rgb = true });
this.comboBox1.Items.Add(new ComboBoxItem { Rgb = false });
Когда вам нужно добавить элементы в ListBox:
this.listBox1.Items.Add(
new ListBoxItem { Rgb = true, Color = Color.Red });
Теперь, когда вы переключаетесь между RGB и HTML в ComboBox, вы получаете выбранный элемент 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];
}
}
Извините, но я пытаюсь изменить формат HTML на формат HTML при нажатии HTML в поле со списком и изменить формат списка на формат RGB при нажатии RGB. Если я добавляю по одному, как изменить все ранее добавленные элементы?
Затем, когда я захочу добавить больше элементов, могу ли я просто следовать этому?
Если вы хотите добавить один элемент, просто сделайте один listbox1.Items.Add(...). Это только добавить один элемент. Остальные элементы остаются в списке, но это не проблема, потому что они могут отображать цвета в RGB или HTML, используя предыдущий код.
Извините, я имел в виду, когда я добавляю больше элементов в поле со списком, могу ли я просто следовать этому формату?
Да, вы можете добавить в ComboBox простую строку, а также объект класса со всеми необходимыми свойствами. Когда вы используете класс, текст элемента является возвратом метода ToString. С ListBox то же самое.
Я очень ценю тебя!!
Вам не нужно зацикливаться. Комментируйте
for(int i = 0; i < RecentColors.Count; i++)и пробуйте.