سؤال

أنا أستخدم PropertyGrid في تطبيق أكتب للسماح للمستخدمين بعرض وأحيانًا تحرير مثيلات كائناتي. في بعض الأحيان ، قد يكون لدى المستخدم ملف مفتوح في وضع القراءة/الكتابة حيث يمكنه إجراء تغييرات على الملف من خلال شبكة الخصائص. في حالات أخرى ، قد يكون لديهم ملف مفتوح في وضع القراءة فقط ، ويجب ألا يكونوا قادرين على إجراء أي تغييرات على الكائنات من خلال forpetyGrid. تحتوي فصولي أيضًا على خصائص ديناميكية يتم إرجاعها عن طريق تنفيذ IcustomTypedescriptor. وهذا هو السبب في أنني أريد حقًا الاستفادة من المرونة المدمجة للتحكم في PropertyGrid.

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

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

المحلول

منذ أن تنفذ ICustomTypeDescriptor ليست هناك حاجة لإضافة أي سمات ؛ يمكنك فقط تجاوز IsReadOnly على ال PropertyDescriptor. أعتقد أنه يجب أن يكون من السهل جدًا كتابة نوع وسيط يحاكي (عبر ICustomTypeDescriptor و TypeConverter) نوع ملفوف ولكن دائما يعود القراءة PropertyDesciptor حالات؟ اسمحوا لي أن أعرف إذا كنت تريد مثالًا (ليس كذلك تافه رغم ذلك).

قد ترغب أيضًا في التحقق مما إذا كان هناك شيء ما مثله تقدمه بنيته.

نصائح أخرى

لقد وجدت حلاً سريعًا جدًا للتفتيش الذين لا يهتمون بوجود Propertygrid الذي يتم تجميعه.

TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;

تتمثل نصيحتي في كتابة عنصر تحكم مخصص يرث من تحكم PropertyGrid ، وفي هذا التحكم المخصص ، يكون له قيمة منطقية من القراءة ، ثم تجاوز بعض الأشياء والتحقق ، إذا (للقراءة) ثم إلغاء الإجراء

ركضت في هذا واحد. أردت تحكمًا تم قراءته فقط ولكن ليس رماديًا.

يرث من التحكم في شبكة الخصائص وإنشاء إصدار قراءة خاص بك فقط عن طريق إضافة الكود التالي لتجاوز ضغوط المفتاح

#Region "Non-greyed read only support"

Private isReadOnly As Boolean
Public Property [ReadOnly]() As Boolean
    Get
        Return Me.isReadOnly
    End Get
    Set(ByVal value As Boolean)
        Me.isReadOnly = value
    End Set
End Property


Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    If Me.isReadOnly Then Return True
    Return MyBase.ProcessDialogKey(keyData)
End Function

Public Function PreFilterMessage(ByRef m As Message) As Boolean
    If m.Msg = &H204 Then 'WM_RBUTTONDOWN
        If Me.isReadOnly Then Return True
    End If
    Return False
End Function
#End Region
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top