Справочный источник Microsoft дает нам реализацию Control.UseWaitCursor и Control.Cursor . Если вы изучите Control.Cursor, то увидите, что если для UseWaitCursor установлено значение True, Control.Cursor возвращает Cursor.WaitCursor независимо от того, какой курсор установлен на элементе управления. Из-за этого поведения значение, возвращаемое из Control.Cursor, не может быть кэшировано.
// DON'T DO THIS: THIS CODE WILL BREAK IF UseWaitCursor IS SET TO TRUE
// Store the original cursor
Cursor cachedCursor = this.Cursor;
// Set the cursor to a wait cursor.
this.Cursor = Cursors.WaitCursor;
// Perform some task
// Restore the original cursor
this.Cursor = cachedCursor;
Хотя вышеприведенное выглядит достаточно безвредным, оно может мгновенно привести к проблемам, если кто-то установит Control.UseWaitCursor в True до его выполнения. Результатом будет зависание курсора ожидания из-за Control.Cursor, возвращающего Cursors.WaitCursor в первой строке выше. Таким образом, лучший метод для изменения курсора:
// Change the cursor as needed
this.Cursor = Cursors.WaitCursor;
// Perform some task
// Restore the default cursor when finished.
this.Cursor = this.DefaultCursor;
Для подавляющего большинства вещей вышеприведенного должно быть достаточно, чтобы при необходимости отображать курсор ожидания. Однако, если дочерний элемент управления также изменяет курсор, курсор, установленный дочерним элементом, переопределит тот, который установлен в родительском элементе. То есть, если вы устанавливаете курсор метки в Cursors.IBeam в форме, которая устанавливает курсор в Cursors.WaitCursor, метка будет отображать IBeam, в то время как форма отображает WaitCursor. Только элементы управления, в которых Control.Cursor возвращает то же значение, что и Control.DefaultCursor, будут отображать набор WaitCursor в форме в этом случае. Вот тут-то и появляется Control.UseWaitCursor. Установка UseWaitCursor в форме также устанавливает UseWaitCursor для всех его дочерних элементов. Пока ни один из элементов управления в форме не использует неработающий код выше. DataGridView - это только один из многих элементов управления, которые использовали неработающий код выше.
Но .. что если вы не хотите WaitCursor и хотите сохранить курсор установленным пользователем вашего элемента управления? В этом случае ваши параметры ограничены, вы должны переопределить свойство Cursor вашего элемента управления, чтобы получить курсор, установленный пользователем вашего элемента управления, ИЛИ вы должны использовать отражение, чтобы получить доступ к значению внутреннего курсора, сохраненному базовым классом Control. Тогда и только тогда вы можете использовать первый метод, описанный выше, для кэширования и восстановления курсора. * Примечание: вы должны кэшировать значение внутреннего курсора, установленное пользователем вашего элемента управления, а не результат из base.Cursor!