установить отправителя в событии на переменную

1

У меня есть 3 события, связанные с перетаскиванием.

    object originalSender;

    private void lstBox_MouseDown(object sender, MouseEventArgs e)
    {
        ListBox curListBox = sender as ListBox;
        if (curListBox.SelectedItem == null) return;
        //this.lstLeft.DoDragDrop(this.lstLeft.SelectedItem, DragDropEffects.Move);
        curListBox.DoDragDrop(curListBox.SelectedItem, DragDropEffects.Copy);
        originalSender = sender;
    }

    private void lstBox_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }

    private void lstBox_DragDrop(object sender, DragEventArgs e)
    {
        var obj = e.Data.GetData(e.Data.GetFormats()[0]);

        if (typeof(DataGridViewColumn).IsAssignableFrom(obj.GetType()))
        {
            ListBox curListBox = sender as ListBox;
            Point point = curListBox.PointToClient(new Point(e.X, e.Y));
            int index = curListBox.IndexFromPoint(point);
            if (index < 0)
                if (curListBox.Items.Count > 0)
                    index = curListBox.Items.Count - 1;
                else
                    index = 0;
            ((ListBox)(originalSender)).Items.Remove(obj);
            curListBox.Items.Insert(index, obj);
        }

Проблема заключается в том, что "originalSender" имеет значение null при запуске метода lst_DragDrop. Я уверен, это потому, что я ссылаюсь на объект отправителя, который получает мусор, собранный и, таким образом, null. Как я могу ссылаться на поле списка, которое является отправителем.

У меня 3 ListBoxes используют этот метод, поэтому мне нужно знать, какой из них выбран.

  • 0
    Попробуйте ListBox originalSender = (ListBox) sender;
  • 0
    Почему бы не использовать закрытую переменную, которая возвращается? Или, еще лучше, инкапсулированное поле (свойство) для хранения значения для использования в течение всего жизненного цикла? Хотя вы можете сделать экземпляр , который должен выглядеть как ((ListBox)sender). что-то.
Показать ещё 1 комментарий
Теги:
winforms
events
listbox

1 ответ

1
Лучший ответ

Попытайтесь перенести инструкцию originalSender = sender перед вызовом DoDragDrop; DoDragDrop запускает новый насос сообщений в том же потоке, поэтому в настоящее время оператор не выполняется до конца операции перетаскивания.


В качестве примечания:

Я уверен, что это потому, что я ссылаюсь на объект отправителя, который собирает мусор и, таким образом, null

Нет, это невозможно. Вы получили это назад: сборщик мусора никогда не устанавливает ссылку на объект на null, он просто собирает объекты, на которые больше не ссылаются.

  • 0
    Вот и все, спасибо.
  • 0
    Спасибо за разъяснения по сбору мусора. Заглянул в нее побольше и понял.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню