Как предотвратить прокрутку при обновлении в PropertyGrid? - PullRequest
3 голосов
/ 14 ноября 2008

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 17 ноября 2008

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

2 голосов
/ 17 августа 2012

Я нашел интересный хак:

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

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

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

1 голос
/ 26 июня 2016
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);
           }
     }
}
1 голос
/ 19 июня 2014

Для меня разница имела значение:

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

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

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

...