C # Нужна помощь с ошибкой в ​​коде с помощью перетаскивания и изменения изображения курсора - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над программой, которая включает в себя изменение изображения курсора во время события перетаскивания, примерно через 1:30 минут выполнения или после завершения ~ 120 перетаскиваний, программа вылетает со следующей ошибкой.

System.Runtime.InteropServices.ExternalException  
HResult=0x80004005  
Message=A generic error occurred in GDI+.  
Source=System.Drawing  
StackTrace:  
at System.Drawing.Bitmap.GetHicon()  
at Planner.Form1.dataGridView1_DragOver(Object sender, DragEventArgs e) in C:\Users\Name\Desktop\Items\Organizer\Planner\Planner\Form1.cs:line 319  
at System.Windows.Forms.Control.OnDragOver(DragEventArgs drgevent)  
at System.Windows.Forms.Control.System.Windows.Forms.IDropTarget.OnDragOver(DragEventArgs drgEvent)  
at System.Windows.Forms.DropTarget.System.Windows.Forms.UnsafeNativeMethods.IOleDropTarget.OleDragOver(Int32 grfKeyState, POINTSTRUCT pt, Int32& pdwEffect)

Вот код, который я использую для изменения курсора.Когда я впервые столкнулся с проблемой, я добавил try / catch, чтобы посмотреть, смогу ли я просто пропустить, вместо этого это приводит к ухудшению работы программы и ее поломке в других областях (без ошибок, просто отставание и неправильная работа)

private void dataGridView1_DragOver(object sender, DragEventArgs e)
    {
    e.Effect = DragDropEffects.Move;
    //MessageBox.Show(CursorID);

    //try
    {
    Bitmap DragCursor = new Bitmap(myPath + CursorID + ".png");
    DragCursor.MakeTransparent(Color.FromArgb(0, 0, 0, 0));  //TODO: This doesn't add transparency
    Cursor cur = new Cursor(DragCursor.GetHicon());
    Cursor.Current = cur;
    DragCursor.Dispose();
    }
    //catch (Exception ex)
    //{

    //}
    }

Функция перетаскивания работает в DataGridView ячеек изображения и текста (где видны только ячейки изображения).Каждое изображение имеет связанный идентификатор, который размещается в правой соседней ячейке, чтобы отслеживать, какое изображение присутствует.При инициации перетаскивания изображение начальной ячейки удаляется (и появляется в виде курсора), затем при его отбрасывании целевая ячейка удерживается в памяти, изображение курсора сбрасывается в цель, а первоначальная ячейка заменяется изображением, которое теперь удерживается (от цели).Просто чтобы помочь дать представление о том, что происходит.В папке более 10000 изображений.

...