PropertyGrid에서 새로 고침의 스크롤을 방지하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
도구 앱에서 PropertyGrid를 사용하여 원격 앱에서 객체를 모니터링하기 위해 창을 표시합니다. 매 초마다 변경된 멤버의 상태와 함께 앱에서 업데이트를 받고 그리드를 업데이트합니다. 변경 사항을 취하기 위해 새로 고침 ()에 전화합니다. 이것은 한 가지를 제외하고는 모두 잘 작동합니다.
물체가 너무 키가 너무 키가 그리드에 맞지 않아 스크롤 바가 있다고 가정 해 봅시다. 사용자는 그리드 항목을 선택했지만 선택한 항목이 컨트롤 하단 아래에 있도록 위로 스크롤했습니다.
문제는 refresh ()에서 컨트롤이 그리드 항목을 자동으로 스크롤한다는 것입니다.
나는 이것을 방지하거나 상태를 저장하고, 새로 고침 ()을 수행 한 다음 다시 설정하는 방법을 찾고 있습니다. PropertyGrid 내부의 PropertyGridView에서 기본 vscrollbar를 가져 와서 "값"을 엉망으로 만들려고했지만 영구적으로 설정되지는 않았습니다. 항목이보기에 항상 뒤로 물러납니다.
스크롤 중에 항목을 선택 해제하는 것은 내 폴백입니다 (자동 스크롤-뷰 뷰는 선택한 그리드 항목 없이는 발생하지 않습니다).
누구든지 비슷한 일을 마치고 있습니까?
해결책
MS PropertyGrid에서는 불가능합니다. 이 구성 요소에는 접근 할 수없는 내부가 너무 많아서 요청하는 유연성을 제공하고 자신을 깨달았을 때 일관성이 없다는 것을 깨달았습니다 (그리드 아래의 속성에 대한 문제가 있지만 위의 경우에는 그렇지 않습니다). 그것이 내가 만든 이유입니다 Smart PropertyGrid.net. 상용 제품이 귀하를위한 옵션 인 경우이 그리드에는 깜박임없이 그리드 (Ryphend ())에서 조치를 취한 후 재산 상태를 저장하고 복원 할 수있는 옵션이 있습니다.
다른 팁
흥미로운 해킹을 찾았습니다.
변경 한 그리드 항목을 수동으로 선택할 수 있으며 새로 고침됩니다 :)
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);
}
}
}