Como impedir a rolagem na atualização em um PropertyGrid?
-
08-07-2019 - |
Pergunta
Estou usando um PropertyGrid em um aplicativo de ferramenta para mostrar uma janela para monitorar um objeto em um aplicativo remoto. A cada segundo, recebo uma atualização do aplicativo com o estado de todos os membros que mudaram e atualizo a grade. Eu chamo o refresh () para fazer as alterações levarem. Tudo isso funciona muito bem, exceto uma coisa.
Digamos que o objeto seja alto demais para caber na grade, para que haja uma barra de rolagem. O usuário selecionou um item de grade, mas também rolou acima dele para que o item selecionado fique abaixo da parte inferior do controle.
O problema é que, no refresh (), o controle rola automaticamente o item da grade em exibição (estranhamente não faz isso quando o item está acima da parte superior do controle).
Estou procurando uma maneira de impedir isso ou salvar o estado, fazer o refresh () e depois colocá -lo de volta. Tentei obter o vscrollbar subjacente no PropertyGridView dentro do PropertyGrid e mexendo com "Valor", mas ele não permanece permanentemente definido. Sempre aparece para trás para que o item esteja em vista.
Desmarcar o item durante a rolagem é o meu fallback (a visualização de rolagem automática não acontece sem nenhum item de grade selecionado), mas prejudica um pouco a usabilidade, então estou procurando outra maneira.
Alguém encontra algo semelhante?
Solução
Isso não é possível no MS PropertyGrid. Esse componente possui muitos internos inacessíveis para fornecer a flexibilidade que você está solicitando e, como você percebeu, não é consistente (você tem o problema de uma propriedade abaixo da grade, mas não quando está acima). É por isso que eu criei Smart PropertyGrid.net. Se um produto comercial for uma opção para você, esta grade tem a opção de armazenar estados imobiliários e restaurá -los depois que você fez uma ação na grade (como refresh ()) sem qualquer lampejo.
Outras dicas
Eu encontrei um hack interessante:
Você pode selecionar manualmente os itens da grade que mudou e eles serão atualizados :)
var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();
Então eu seleciono itens que preciso e depois mover a seleção de volta
Para mim, o seguinte fez a diferença:
Não atribua um novo objeto.
Basta atualizar os campos do objeto antigo com os novos dados.
Agora, na atualização, meu PropertyGrid não rola mais e também mostra conteúdo atualizado.
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);
}
}
}