سؤال

أنا أكتب كائن 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); }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top