ReadOnly PropertyGrid
-
22-09-2019 - |
سؤال
أنا أستخدم 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