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?

Foi útil?

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);
           }
     }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top