سؤال

أنا أستخدم خصائص لإظهار الخصائص من كائناتي. ومع ذلك، أنا أيضا السماح للمستخدم بإنشاء خصائص خاصة بهم، وقم بتعيين القيم لهذه الخصائص المخصصة. يحتوي كل كائن يمكن أن يحتوي هذه الخصائص المخصصة على مجموعة قاموس، حيث تكون السلسلة مفتاح فريد لتحديد العقار، والكائن هو قيمة نوع بدائي (سلسلة، BOOL، ITC وغيرها.)

لقد قمت بإنشاء خصائص مخصصة مع طرق الحصول على وتعيين التي تحقق من القاموس للحصول على مفتاح مطابق، أو إنشاء / الكتابة فوق القيمة باستخدام مفتاح مطابق على التوالي.

ومع ذلك، أريد أيضا إعطاء المستخدم القدرة على مسح الممتلكات، وبالتالي إزالة دخوله من القاموس بالكامل. سأضع الكود إلى هذا في طريقة تجاوز إعادة التعيين الخاصة بخصائص PropertyDescriptor الخاصة بي، ومع ذلك، لا أرى أي طريقة من خلال واجهة PropertyGrid لتحليل هذا؟ لا يبدو أنه خيار قائمة السياق أو شيء واضح من هذا القبيل.

لذلك إذا كان لدي خصائص مخصصة مع طريقة إعادة تعيين مخصص، كيف يمكنني أن أستحضر هذه الطريقة بالفعل من شركة خصوصية؟

هل كانت مفيدة؟

المحلول

أعتقد أن أسهل طريقة لتحقيق ذلك هي إضافة ContextMenu إلى شبكة الممتلكات الخاصة بك، مع عنصر القائمة "إعادة تعيين"، ثم التعامل مع الحدث انقر فوق هذا:

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