无法制作切换颜色的列表框 [英] Failed to to make a toggle colored list box
问题描述
您好
我正在尝试制作列表框,项目必须是彩色的,并且每当其中一个项目选择该项目更改其颜色时
如果我再次选择它它的颜色返回(切换),但令人惊讶的是,当我按下垂直滚动(违背我的愿望)时发生这种情况
当我使用鼠标选择该项目时,我希望它成为切换。
我认为想要的项目的索引在鼠标点击事件中不可用(鼠标点击(对象发送者,MouseEventArgs e))。
即使你添加了另一个按钮,我也会接受答案。通过任何其他方式
谢谢
我尝试过:
Hello
I am trying to make listbox, the items must be colored and whenever one of its items selected that item changed its color
And if I select it again its color returns back (toggle), but surprisingly that happened when I press the vertical scroll (against my desire)
I want it to become toggle when I select that item using mouse.
I think the index of the wanted item will not be available in mouse click event(mouseclick(object sender, MouseEventArgs e)) .
I will accept the answer even if you add another button or by any other way
thanks
What I have tried:
int[] MARK = new int[10];
ListBox lb = new ListBox();
private void FormLoad(object sender, EventArgs e)
{
for (i = 0; i < 10; i++) str3[i] = "Hello_"+i.ToString();
lb.Items.AddRange(str3);//new object[] { str3 });
lb.Location = new System.Drawing.Point(80, 40);
lb.Size = new System.Drawing.Size(160, 80);
lb.DrawMode = DrawMode.OwnerDrawFixed;
lb.DrawItem += new DrawItemEventHandler(MyListBox_DrawItem);
Controls.Add(lb);
}
private void MyListBox_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lbSender = (ListBox)sender;
if (lbSender == lb && (e.State & DrawItemState.Selected) != DrawItemState.Selected)
{
e.DrawBackground();
string s = lb.Items[e.Index].ToString();
Brush brush = Brushes.Green;
if (MARK[e.Index] == 0) {brush = Brushes.Blue;}
else if (MARK[e.Index] == -1) {brush = Brushes.Red;}
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, brush, e.Bounds.Location, StringFormat.GenericDefault);
}
else if (lbSender == lb && (e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
e.DrawBackground();
string s;
Brush brush = Brushes.Green;
if (MARK[e.Index] == 0) {brush = Brushes.Red;MARK[e.Index] = -1;}
else if (MARK[e.Index] == -1){brush = Brushes.Blue;MARK[e.Index] = 0;}
s = lb.Items[e.Index].ToString();
e = new DrawItemEventArgs(e.Graphics,
e.Font,
e.Bounds,
e.Index,
e.State ^ DrawItemState.Selected,
e.ForeColor,
Color.Black);
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, brush, e.Bounds.Location, StringFormat.GenericDefault);
e.DrawFocusRectangle();
}
}
推荐答案
你想要实现的目标不是很容易 ListBox ,这是使用System.Diagnostics的 ListView :
What you are trying to achieve is not very easy with a ListBox, here is an example with a ListView:
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
namespace ListboxToggle
{
public partial class Form1 : Form
{
int[] MARK = new int[10];
ListView lv = new ListView();
public Form1()
{
InitializeComponent();
lv.View = View.Details;
lv.MultiSelect = false;
lv.FullRowSelect = true;
lv.Columns.Add("Header", 160);
lv.HeaderStyle = ColumnHeaderStyle.None;
lv.Location = new Point(80, 40);
lv.Size = new Size(160, 80);
for (int i = 0; i < 10; i++)
{
lv.Items.Add("Hello_" + i);
}
Controls.Add(lv);
lv.SelectedIndexChanged += listview_SelectedIndexChanged;
}
private void listview_SelectedIndexChanged(object sender, System.EventArgs e)
{
ListView lbSender = (ListView)sender;
foreach (ListViewItem item in lbSender.SelectedItems)
{
Debug.Print(item.Text);
if (item.BackColor == Color.Red)
{
item.BackColor = Color.White;
}
else
{
item.BackColor = Color.Red;
}
}
}
}
}
这篇关于无法制作切换颜色的列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!