C # Как выбрать элемент ListBox с правой кнопкой мыши? - PullRequest
3 голосов
/ 10 февраля 2012

Я испробовал множество методов для этого и провел многочасовые исследования, но мне кажется, что это никогда не сработало.

Это мой текущий код, и я не знаю, почему он не долженне работает.

    private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y);
        if (e.Button == MouseButtons.Right)
        {
            contextMenuStrip1.Show();
        }
    }

Также меня не волнует контекстное меню, которое можно удалить. Я просто ищу способ заставить правую кнопку мыши выбрать элемент, по которому я щелкаю.

Есть идеи?

Ответы [ 5 ]

7 голосов
/ 10 февраля 2012

Вы близки, вы просто забыли выбрать предмет.Исправить:

    private void listBox1_MouseUp(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Right) {
            var item = listBox1.IndexFromPoint(e.Location);
            if (item >= 0) {
                listBox1.SelectedIndex = item;
                contextMenuStrip1.Show(listBox1, e.Location);
            }
        }
    }
2 голосов
/ 26 ноября 2012
  private void lstFiles_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)   //(1)
        {
            int indexOfItemUnderMouseToDrag;
            indexOfItemUnderMouseToDrag = lstFiles.IndexFromPoint(e.X, e.Y); //(2)
            if (indexOfItemUnderMouseToDrag != ListBox.NoMatches)
            {
                lstFiles.SelectedIndex = indexOfItemUnderMouseToDrag; //(3)
            }
        }
    }
0 голосов
/ 20 июня 2012

Я имел дело с той же проблемой. Из ответа Ханса Пассанта я немного подправил его, чтобы получить приведенный ниже код. Я также обнаружил, что мне вообще не нужно вставлять contextMenuStrip1.Show(listBox1, e.Location);. Он был автоматически вызван для меня.

(Я использую Visual Studio 2010 Ultimate с компиляцией в .NET 4. Я также убедился, что приведенный ниже код работает для ОБА MouseUp и MouseDown.)

    private void OnMouseDown(object sender, MouseEventArgs args)
    {
        if (args.Button == MouseButtons.Right)
        {
            var item = this.IndexFromPoint(args.Location);
            if (item >= 0 && this.SelectedIndices.Contains(item) == false)
            {
                this.SelectedItems.Clear();
                this.SelectedIndex = item;
            }
        }
    }
0 голосов
/ 10 февраля 2012
    private void listBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button== MouseButtons.Right)
        {
            int nowIndex = e.Y / listBox1.ItemHeight;
            if (nowIndex < listBox1.Items.Count)
            {
                listBox1.SelectedIndex = e.Y / listBox1.ItemHeight;
            }
            else
            {
                //Out of rang
            }
        }
    }

Я не знаю много в C #, но я пытался:)

0 голосов
/ 10 февраля 2012

Каждый элемент управления наследует свойство ContextMenu из класса Control. Присвойте свой объект контекстного меню свойству ContextMenu элемента управления со списком, и WinForms автоматически его обработает.

...