문제

나는 속성 그리드를 사용하여 내 개체에서 속성을 보여줍니다. 그러나 사용자가 자신의 특성을 만들고 이러한 사용자 지정 속성에 대한 값을 설정할 수 있습니다. 이러한 사용자 정의 속성을 가질 수있는 각 객체는 사전 컬렉션이 있으며, 여기서 문자열은 속성을 식별하는 고유 키이며, 개체는 원시 유형 (문자열, bool, int 등)의 값입니다.

일치 키의 사전을 확인하거나 일치 키로 값을 각각 생성/덮어 쓰는 Get and Set 메소드가 포함 된 사용자 정의 속성 디스크립터를 만들었습니다.

그러나 또한 사용자에게 속성을 청소할 수있는 능력을 제공하고 사전에서 전적으로 항목을 제거하고 싶습니다. Custom PropertyDescriptor의 ResetValue 재정의 메소드에서 코드를 작성했지만 PropertyGrid 인터페이스를 통해이를 거부 할 수있는 방법이 없습니까? 상황에 맞는 메뉴 옵션이나 그런 분명한 것 같지는 않습니다.

사용자 정의 재설정 방법이있는 사용자 정의 속성 데스 스크립터가있는 경우 실제로 속성 그리드에서 해당 메소드를 어떻게 불러 일으키나요?

도움이 되었습니까?

해결책

이를 달성하는 가장 쉬운 방법은 메뉴 항목 "재설정"을 사용하여 속성 그리드에 컨텍스트 메뉴를 추가 한 다음 다음과 같은 클릭 이벤트를 처리하는 것입니다.

private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{                        
    PropertyDescriptor pd = propGrid.SelectedGridItem.PropertyDescriptor;
    pd.ResetValue(propGrid.SelectedObject);
}

Visual Studio가 이런 일을한다고 생각합니다.

다른 팁

주석 : propertygrid.selectedObject는 childobjects에서 잘못된 값 (구성 요소)을 반환합니다. 결과적으로 메소드 CanResetValue는 잘못된 구성 요소를 재발했습니다.

내 해결책 :

private void OnContextMenuOpening(object sender, CancelEventArgs e)
{
  var lGrid = mCurrentControl as PropertyGrid;

  if (lGrid != null)
  {
    var lItem = lGrid.SelectedGridItem;

    // Für untergeordnete Eigenschaften kann nicht SelectedObject verwendet werden
    // Component ist eine interne Eigenschaft der Klasse System.Windows.Forms.PropertyGridInternal.GridEntry
    // ((System.Windows.Forms.PropertyGridInternal.GridEntry)(lItem)).Component
    // Zugriff via Reflection
    var lComponent = lItem.GetType().GetProperty("Component").GetValue(lItem, null);

    if (lComponent != null)
      tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lComponent);
    else
      tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lGrid.SelectedObject);
  }
}

// Contextmenu -> Reset
private void OnResetProperty(object sender, EventArgs e)
{
  var lGrid = mCurrentControl as PropertyGrid;

  if (lGrid != null)
    lGrid.ResetSelectedProperty();
}

자식 대상의 경우 속성을 포함하는 물체에 대한 참조는 Instance 비공개 후손의 재산 GridItem 수업. 고맙게도이 재산은 회원입니다 ITypeDescriptorContext 이 자손 클래스가 구현하는 인터페이스. 따라서 모든 속성에 대한 컨텍스트 메뉴에서 재설정 명령을 올바르게 활성화하는 솔루션이 있습니다.

private void contextMenuToolStrip_Opening(object sender, CancelEventArgs e)
{
  var item = propertyGrid.SelectedGridItem;
  resetToolStripMenuItem.Enabled = item != null &&
                                   item.GridItemType == GridItemType.Property &&
                                   item is ITypeDescriptorContext context &&
                                   item.PropertyDescriptor.CanResetValue(context.Instance);
}

private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
  propertyGrid.ResetSelectedProperty();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top