无法制作切换颜色的列表框 [英] Failed to to make a toggle colored list box

查看:62
本文介绍了无法制作切换颜色的列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好

我正在尝试制作列表框,项目必须是彩色的,并且每当其中一个项目选择该项目更改其颜色时

如果我再次选择它它的颜色返回(切换),但令人惊讶的是,当我按下垂直滚动(违背我的愿望)时发生这种情况

当我使用鼠标选择该项目时,我希望它成为切换。

我认为想要的项目的索引在鼠标点击事件中不可用(鼠标点击(对象发送者,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆