none
Comment modifier dynamiquement le ReadOnly attribut d'un objet RRS feed

  • Discussion générale

  • Bonjour,

    Comment faire pour changer la valeur de l'attribut ReadOnly uniquement sur un objet.

    La petite demo, ci-dessous expose bien le problème. En faite, le change toute l'attribut ReadOnly de tous les objets ayant le même type.

     

    Merci d'avance de votre aide,

    Cordialement,

    Cédric

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using ControlLibrary;
    using System.Reflection;
    
    namespace WindowsFormsMocking
    {
      public partial class Form1 : Form
      {
        private ContactInfo contactInfo = null;
    
        public Form1()
        {
          InitializeComponent();
          contactInfo = new ContactInfo();
          contactInfo.ChildContact = new ContactInfo();
          propertyGrid1.SelectedObject = contactInfo;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          ContactInfo.SetMobileEdit(contactInfo, "Mobile", false);
          propertyGrid1.Refresh();
        }
      }
    
      [TypeConverter(typeof(ExpandableObjectConverter))]
      public class ContactInfo
      {
        [ReadOnly(false)]
        [Category("Contact Info")]
        public string Mobile { get; set; }
    
        [Category("Contact Info")]
        public string Name { get; set; }
    
        [Category("Child contact Info")]
        public ContactInfo ChildContact { get; set; }
    
        static public void SetMobileEdit(object instance, string property, bool allowEdit)
        {
          PropertyDescriptor descriptor = TypeDescriptor.GetProperties(instance.GetType())[property];
          ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
          FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
    
          // the Mobile property becomes Readonly for both contactInfo and souContactInfo
          // unfortunatly, I'm not finding the way to modified only contactInfo instance
          isReadOnly.SetValue(attrib, !allowEdit);
          
        }
      }
    }
    

     

     

    mardi 21 décembre 2010 15:05

Toutes les réponses

  • Bonjour,

    Quel est l'objectif général ? TypeDescriptor est basé sur un mécanisme de fournisseur. Il serait donc éventuellement possible de modifier ce que retourne ce fournisseur selon l'état du moment. A noter qu'effectivement ces attributs s'apliquent à une classe et non pas à un object particulier. Après je ne vois pas très bien quel est le but poursuivi ? Pour moi, cet attribut n'indique pas si la propriété est en lecture seule ou pas à un moment donné mais plutôt si elle est TOUJOURS en lecture seule (par exemple un age qui serait calculée à partir d'une date de naissance).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 21 décembre 2010 16:48
    Modérateur