Как предотвратить прокрутку при обновлении в PropertyGrid?

StackOverflow https://stackoverflow.com/questions/288893

  •  08-07-2019
  •  | 
  •  

Вопрос

Я использую PropertyGrid в приложении инструмента, чтобы показать окно для мониторинга объекта в удаленном приложении. Каждую секунду или около того я получаю обновление из приложения с указанием состояния всех участников, которые изменились, и я обновляю сетку. Я вызываю Refresh (), чтобы изменения вступили в силу. Все это работает довольно хорошо, кроме одной вещи.

Скажите, что объект слишком высок, чтобы поместиться в сетку, поэтому есть полоса прокрутки. Пользователь выбрал элемент сетки, но также прокрутил его выше, чтобы выбранный элемент находился ниже нижней части элемента управления.

Проблема в том, что в Refresh () элемент управления автоматически прокручивает элемент сетки в поле зрения (странно, что он этого не делает, когда элемент находится над верхней частью элемента управления).

Я ищу способ предотвратить это или сохранить состояние, выполнить Refresh () и затем установить его обратно. Я попытался получить базовый VScrollBar в PropertyGridView внутри PropertyGrid и поэкспериментировать со значением «Value», но он не был установлен постоянно. Всегда всплывает, так что элемент в поле зрения.

Отмена выбора элемента во время прокрутки - это мой запасной вариант (автоматическая прокрутка в представлении отсутствует при отсутствии выбранного элемента сетки), но она немного ухудшает удобство использования, поэтому я ищу другой способ.

Кто-нибудь сталкивался с чем-то похожим?

Это было полезно?

Решение

Это невозможно в MS PropertyGrid. В этом компоненте слишком много недоступных внутренних компонентов, чтобы предоставить вам требуемую гибкость, и, как вы сами осознали, он не согласован (у вас есть проблема для свойства ниже сетки, но не когда оно выше). Вот почему я создал Smart PropertyGrid.Net . Если вам нужен коммерческий продукт, в этой сетке есть возможность сохранять состояния свойств и восстанавливать их после того, как вы сделали какое-либо действие с сеткой (например, Refresh ()) без мерцания.

Другие советы

Я нашел интересный взлом:

вы можете вручную выбрать элементы сетки, которые вы изменили, и они будут обновлены:)

var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();

Поэтому я выбираю нужные мне элементы, а затем перемещаю выбор назад

Для меня это изменило следующее:

не назначайте новый объект.

Просто обновите поля старого объекта новыми данными.

Теперь при обновлении моя PropertyGrid больше не прокручивается, а также показывает обновленный контент.

public void SoftRefreshPropertyGrid()
{
     var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as  System.Windows.Forms.GridItem;
     if (peMain != null)
     {
           var refreshMethod = peMain.GetType().GetMethod("Refresh");
           if (refreshMethod != null)
           {
                  refreshMethod.Invoke(peMain, null);
                  propertyGrid.Invalidate(true);
           }
     }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top