تحميل datagridviewcellstyle وإعطاء قيمة افتراضية
-
19-09-2019 - |
سؤال
أنا أكتب كائن DataGridView مخصص لمشروع كبير لتسليم مجموعة من المطورين لجعل أقسام التطبيق لدينا تبدو متسقة.
أريد تعيين الإعدادات الافتراضية للعديد من خصائص DataGridView، ويمكنني تعيين الكثير منهم مثل هذا:
<System.ComponentModel.Browsable(True), System.ComponentModel.DefaultValue(DataGridViewAutoSizeColumnsMode.Fill)>_
Public Overloads Property AutoSizeColumnsMode() As DataGridViewAutoSizeColumnMode
Get
Return MyBase.AutoSizeColumnsMode
End Get
Set(ByVal value As DataGridViewAutoSizeColumnMode)
MyBase.AutoSizeColumnsMode = value
End Set
End Property
هذه الخصائص الزائدة مع الإعدادات الافتراضية على ما يرام. إنه عندما بدأت في محاولة تكوين أنماط الخلايا الافتراضية التي ركضت في هذه المشكلة. نظرا لأن DataGridViewCellStyle هو فئة، لا أستطيع أن أخرج ثابتا منه. لقد حاولت تغيير جميع الإعدادات على ما أريد أن أكون في منشئ الفصل، وهذا يعمل بشكل رائع، باستثناء هذه التغييرات التي تم إجراؤها في خصائص المصمم فقط تعيد تعيينها بمجرد تشغيل التطبيق. لذا فإن وضع التغييرات في المنشئ لن يفعله.
هل هناك أي مكان آخر يمكنني وضع التعليمات البرمجية التي تعمل فقط عند إسقاط عنصر التحكم لأول مرة في المصمم؟ أو أي طريقة أخرى لإعداد الافتراضي؟
المحلول 2
في الواقع، فكرت في الأمر لفترة أطول وأودت عن حل أبسط لقضائي. هذا لا يعمل من أجل جميع الحالات لأنه يعتمد على حقيقة أن الشخص الذي يستخدم المكون المخصص من المحتمل أن يرغب أبدا في العودة إلى افتراضيات CellStyle كاملة إلى Windows الافتراضية. لقد انتهى الأمر بمقارنة CellStyle جديدا للوحدة الحالية في المنشئ، وعلى إعداد النمط فقط إذا كانت متطابقة. وبهذه الطريقة، لن يتم الكتابة فوق التغييرات، لكنه سيقع في المرة الأولى.
Public Class CustomDataGridView
Inherits System.Windows.Forms.DataGridView
Private RowStyle As New DataGridViewCellStyle
Public Sub New()
RowStyle.BackColor = Color.FromArgb(223, 220, 200)
RowStyle.Font = New Font("Arial", 12.75, FontStyle.Bold, GraphicsUnit.Point)
RowStyle.ForeColor = Color.Black
RowStyle.SelectionBackColor = Color.FromArgb(94, 136, 161)
If MyBase.RowsDefaultCellStyle.ToString = (New DataGridViewCellStyle).ToString Then
MyBase.RowsDefaultCellStyle = RowStyle
End If
End Sub
End Class
فقط يذهب لإظهار، فقط لأن لديك مطرقة ذهبية، لا يعني أن كل مشكلة هي مسمار.
نصائح أخرى
ركضت في هذه المشكلة أيضا. يعمل الحل الخاص بي حول متطلبات الوسيطة DefaultValue لتكون ثابتا للوقت. اعتقدت، ألا أكون كافية لتعيين القيمة في منشئ الطبقة (المعرفة من قبل المنشئ الثابت في C #، والبناء المشترك في VB) بدلا من ذلك؟
يبدو أن هذا هو عمل جيد في حالتي، على الرغم من أن هناك مثيلات ربما تكون هناك مثيلات حيث قد تنكسر نظرا لأنها غير موجودة بالفعل في بيانات التعريف حتى يتم استدعاء منشئ الفصل، ولكن لسمة مصمم يجب أن كن مقبولا. نظرا لأن DefaultValueattribute.SetValue محمي، كان علي تحديد فئة مشتقة تجعلها عامة.
يعمل هذا بشكل جيد في المصمم، وهو يتعرف عندما تكون القيمة هي نفسها الافتراضي وتغفلها من التعليمات البرمجية التي تم إنشاؤها عند الإمكان، ويولد فقط الاختلافات من الافتراضي.
إليك الرمز في C #، يجب أن يعمل هذا في VB أيضا ولكنني لست على دراية بسعادة بناء على بناء الجملة لذلك، فعليك أن أترك لك ذلك.
public partial class HighlightGrid : DataGridView
{
// Class constructor
static MethodGrid()
{
// Get HighlightStyle attribute handle
DefaultValueSettableAttribute attr =
TypeDescriptor.GetProperties(typeof(HighlightGrid))["HighlightStyle"]
.Attributes[typeof(DefaultValueSettableAttribute)]
as DefaultValueSettableAttribute;
// Set default highlight style
DataGridViewCellStyle style = new DataGridViewCellStyle();
style.BackColor = Color.Chartreuse;
attr.SetValue(style);
}
[DefaultValueSettable, Description("Cell style of highlighted cells")]
public DataGridViewCellStyle HighlightStyle
{
get { return this.highlightStyle; }
set { this.highlightStyle = value; }
}
// ...
}
// Normally the value of DefaultValueAttribute can't be changed and has
// to be a compile-time constant. This derived class allows setting the
// value in the class constructor for example.
public class DefaultValueSettableAttribute : DefaultValueAttribute
{
public DefaultValueSettableAttribute() : base(new object()) { }
public new void SetValue(Object value) { base.SetValue(value); }
}