2015-09-18 2 views
2

Я создаю пользовательский элемент управления пользователя, который наследуется от DataGridViewColumn.Свойство пользовательского контроля всегда должно быть ложным в C#?

Кроме того, я добавил некоторые свойства в элемент управления, но я не могу изменить их во время разработки.

Даже я установил значение по умолчанию как true, оно все равно false.

код:

public class ParaGridViewColumn : DataGridViewColumn 
{     
    private bool _Necessary; 
    private bool _ReadOnlyEmpty; 

    [Description("Default cell status."), Category("Behavior"), DefaultValue(false)] 
    public bool Necessary { get { return _Necessary; } set { _Necessary = value;} }       
    [Description("When ReadOnly is true, clear value on the cell or not."), Category("Behavior"), DefaultValue(true)] 
    public bool ReadOnlyEmpty { get { return _ReadOnlyEmpty; } set { _ReadOnlyEmpty = value; }}   

    public ParaGridViewColumn() 
    { 
     this.CellTemplate = new ParaGridViewCell(); 
    } 
} 

Новые свойства могут отображаться на окне, но их значение по умолчанию, являются ложными.

Я изменяю их на true, снова вводя и открывая это окно, это все еще ложно.

Тем не менее, я могу регулярно изменять другие свойства. Это означает, что я не заблокировал этот контроль. enter image description here

Почему это? Я сделал что-то неправильно?

Большое спасибо.

+0

Я добавил тэг 'winforms' на ваш вопрос. –

ответ

1

Первая проблема заключается в [DefaultValue(true)] для ReadOnlyEmpty, не устанавливая для нее истинного значения.

Вы не установили для значения по умолчанию значение true. Фактически [DefaultValue(true)] помогает CodeDomeSerizalizer сериализовать значение для этого свойства, если значение свойства не равно этому значению по умолчанию. Вместо этого вы должны установить ReadOnlyEmpty= true в конструкторе или _ReadOnlyEmpty.

private bool _ReadOnlyEmpty=true; 

Проблема здесь, когда вы устанавливаете свойство истинно в свойстве сетки, при закрытии формы, сериализатору не сериализовать истинное значение, потому что вы сказали, что это по умолчанию, но вы не установите его так, так что останется ложным.

Вторая проблема заключается в том, что если вы хотите, чтобы значения сохранялись, вы должны переопределить Clone базового класса и предоставить копию клона, которая содержит ваши пользовательские свойства.

public override object Clone() 
{ 
    ParaGridViewColumn column = (ParaGridViewColumn)base.Clone(); 
    //Uncomment if you have ParaGridViewCell 
    //column.CellTemplate = (ParaGridViewCell)CellTemplate.Clone(); 
    column.Necessary = this.Necessary; 
    column.ReadOnlyEmpty = this.ReadOnlyEmpty; 
    return column; 
} 
+0

Я очень ценю вашу помощь! –

+0

Добро пожаловать :) –

1

Ну, я нашел решение, потеряв функцию повторного клонирования.

public override object Clone() 
{ 
    ParaGridViewColumn c = (ParaGridViewColumn)base.Clone(); 

    c._Necessary = this._Necessary;  
    c._ReadOnlyEmpty = this._ReadOnlyEmpty;    
    return c; 
} 
+0

Хорошая работа, +1,5;) за ваши усилия, чтобы найти ответ и отправить ответ другим пользователям :) –

+0

Но по-прежнему рекомендуем прочитать мой ответ, надеюсь, что вы сочтете это полезным :) –

Смежные вопросы