Engineer khalid Ответов: 1

Не удалось сделать переключение цвета список


Привет
Я пытаюсь сделать listbox, элементы должны быть окрашены, и всякий раз, когда один из его элементов выбирается, этот элемент меняет свой цвет
И если я выберу его снова, его цвет вернется обратно (переключатель), но удивительно, что это произошло, когда я нажал вертикальную прокрутку (против моего желания)
Я хочу, чтобы он стал переключателем, когда я выбираю этот элемент с помощью мыши.
Я думаю, что индекс разыскиваемого элемента не будет доступен в событии щелчка мыши(mouseclick(object sender, MouseEventArgs e)) .
Я приму ответ даже если вы добавите еще одну кнопку или любым другим способом
спасибо

Что я уже пробовал:

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();
    }
}

Gerry Schmitz

Используйте WPF, если вы хотите "фантазии" и меньше / нет боли.

1 Ответов

Рейтинг:
12

RickZeeland

То, чего вы пытаетесь достичь, не очень легко с помощью список, вот пример с 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;
                }
            }
            
        }
    }
}


Engineer khalid

Неплохая альтернатива... моя признательность