У меня есть 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 используют этот метод, поэтому мне нужно знать, какой из них выбран.
Попытайтесь перенести инструкцию originalSender = sender
перед вызовом DoDragDrop
; DoDragDrop
запускает новый насос сообщений в том же потоке, поэтому в настоящее время оператор не выполняется до конца операции перетаскивания.
В качестве примечания:
Я уверен, что это потому, что я ссылаюсь на объект отправителя, который собирает мусор и, таким образом, null
Нет, это невозможно. Вы получили это назад: сборщик мусора никогда не устанавливает ссылку на объект на null, он просто собирает объекты, на которые больше не ссылаются.
((ListBox)sender).
что-то.