массивы в коллекции
От: Lexsus Россия  
Дата: 06.12.05 08:51
Оценка:
У меня есть коллекция GraphInfoCollection. Элементами данной коллекции является структура GraphInfo.
public GraphInfo()
{
        {
        
        }
        private Color colorDraw = Color.DarkBlue;
        public Color  ColorDraw
        {
            get {return colorDraw;}
            set {colorDraw = value;}
        }
        public double  YGrid
        {
            get {return yGrid;}
            set {yGrid = value;}
        }
    
        private double[] xData;
        public double[] XData
        {
            get {return xData;}
            set {xData = value;}
        }
}

Так вот, вопрос,в CollectionEditor, при редактировании массивов изменения не сохраняются. В чем проблема? Заранее благодарен!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: массивы в коллекции
От: Константин Ленин  
Дата: 06.12.05 10:23
Оценка:
потому, что это структура — value type, то есть она копируется и уже ее копияч изменяется в CollectionEditor
Re[2]: массивы в коллекции
От: Lexsus Россия  
Дата: 06.12.05 12:19
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>потому, что это структура — value type, то есть она копируется и уже ее копияч изменяется в CollectionEditor

Это я ошибся, GraphInfo у меня не структура, а класс.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: массивы в коллекции
От: Lexsus Россия  
Дата: 07.12.05 08:05
Оценка:
Может быть ещё кто-нибудь даст совет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: массивы в коллекции
От: wishful Украина  
Дата: 07.12.05 09:09
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>У меня есть коллекция GraphInfoCollection. Элементами данной коллекции является структура GraphInfo.

skip
L>Так вот, вопрос,в CollectionEditor, при редактировании массивов изменения не сохраняются. В чем проблема? Заранее благодарен!

А что это за коллекция? Посмотри, чтобы с ней выполнялись такие условия:
1)Она должна иметь строго типизированный индексатор.
2)Иметь метод Add.
3)GraphInfo пометь как сериализируемый

Также попробуй пометить XData аттрибутом DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
Надеюсь, поможет
Re[2]: массивы в коллекции
От: Lexsus Россия  
Дата: 07.12.05 10:56
Оценка:
Здравствуйте, wishful, Вы писали:

W>А что это за коллекция? Посмотри, чтобы с ней выполнялись такие условия:

W>1)Она должна иметь строго типизированный индексатор.
W>2)Иметь метод Add.
W>3)GraphInfo пометь как сериализируемый

W>Также попробуй пометить XData аттрибутом DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

W>Надеюсь, поможет
Что значит строго типизированый индексатор?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: массивы в коллекции
От: wishful Украина  
Дата: 07.12.05 11:07
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>Что значит строго типизированый индексатор?


В вашем случае это public GraphInfo this[int position]{}
Re[4]: массивы в коллекции
От: Lexsus Россия  
Дата: 07.12.05 11:19
Оценка:
Здравствуйте, wishful, Вы писали:

W>Здравствуйте, Lexsus, Вы писали:


L>>Что значит строго типизированый индексатор?


W>В вашем случае это public GraphInfo this[int position]{}


Я написал индексатор следующим образом:
public GraphInfo this[int nPostition]
{
    {
        get
        {
            return List[nPosition] as GraphInfo;
        }
        set
        {
            List[nPosition] = value;
        }
    }
}


Сделал всё как вы советовали, всё равно не выходит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: массивы в коллекции
От: wishful Украина  
Дата: 07.12.05 11:45
Оценка: 2 (1)
Здравствуйте, Lexsus, Вы писали:
L>Сделал всё как вы советовали, всё равно не выходит.

Посмотрите здесь. Может поможет
Re[6]: массивы в коллекции
От: Lexsus Россия  
Дата: 07.12.05 12:13
Оценка:
Здравствуйте, wishful, Вы писали:


W>Посмотрите здесь. Может поможет

Спасибо за ссылку, буду смотреть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: массивы в коллекции
От: AlexSychev  
Дата: 07.12.05 13:51
Оценка: 2 (1)
Здравствуйте, Lexsus, Вы писали:

L>Здравствуйте, wishful, Вы писали:

W>>Посмотрите здесь. Может поможет
L>Спасибо за ссылку, буду смотреть.
Ссылка не очень информативная, наступал на теже грабли, а тема что тебе нужна уже обсуждалась на форуме.
Помоему решения я нашел имеено здесь.

вот как это у меня получилось

1) сам объект

[TypeConverter(typeof(InputFieldConverter))]
public class InputField
{
private string _name = "";
private string _label = "";

public InputField()
{

}

public InputField(string name, string label)
{
_name = name;
_label = label;
}

[DefaultValue("")]
public string Name
{
get { return _name; }
set{ _name = value; }
}

[DefaultValue("")]
public string Label
{
get { return _label; }
set{ _label = value; }
}
}


2) типизированная коллекция
public class InputFieldCollection : CollectionBase
{
public int Add(InputField inputField)
{
return InnerList.Add( inputField );
}

public InputField this[int index]
{
get { return (InputField)InnerList[index]; }
set { InnerList[index] = value; }
}

public void AddRange(InputField[] inputFields)
{
InnerList.AddRange(inputFields);
}

}

3) и обязательный TypeConverter для InputField (взято из MSDN, см InstanceDescriptor Class [C#])

internal class InputFieldConverter : TypeConverter
{
// This method overrides CanConvertTo from TypeConverter. This is called when someone
// wants to convert an instance of Triangle to another type. Here,
// only conversion to an InstanceDescriptor is supported.
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(InstanceDescriptor))
{
return true;
}

// Always call the base to see if it can perform the conversion.
return base.CanConvertTo(context, destinationType);
}

// This code performs the actual conversion from a Triangle to an InstanceDescriptor.
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(InstanceDescriptor))
{
ConstructorInfo ci = typeof(InputField).GetConstructor(new Type[]{typeof(string), typeof(string)});
InputField t = (InputField) value;
return new InstanceDescriptor(ci,new object[]{t.Name, t.Label});
}

// Always call base, even if you can't convert.
return base.ConvertTo(context, culture, value, destinationType);
}
}
Re[8]: массивы в коллекции
От: Lexsus Россия  
Дата: 07.12.05 15:01
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Ссылка не очень информативная, наступал на теже грабли, а тема что тебе нужна уже обсуждалась на форуме.

AS>Помоему решения я нашел имеено здесь.

AS>вот как это у меня получилось


AS>1) сам объект


AS> [TypeConverter(typeof(InputFieldConverter))]

AS> public class InputField
AS> {
AS> private string _name = "";
AS> private string _label = "";

AS> public InputField()

AS> {

AS> }


AS> public InputField(string name, string label)

AS> {
AS> _name = name;
AS> _label = label;
AS> }

AS> [DefaultValue("")]

AS> public string Name
AS> {
AS> get { return _name; }
AS> set{ _name = value; }
AS> }

AS> [DefaultValue("")]

AS> public string Label
AS> {
AS> get { return _label; }
AS> set{ _label = value; }
AS> }
AS> }


AS>2) типизированная коллекция

AS> public class InputFieldCollection : CollectionBase
AS> {
AS> public int Add(InputField inputField)
AS> {
AS> return InnerList.Add( inputField );
AS> }

AS> public InputField this[int index]

AS> {
AS> get { return (InputField)InnerList[index]; }
AS> set { InnerList[index] = value; }
AS> }

AS> public void AddRange(InputField[] inputFields)

AS> {
AS> InnerList.AddRange(inputFields);
AS> }

AS> }


AS>3) и обязательный TypeConverter для InputField (взято из MSDN, см InstanceDescriptor Class [C#])


AS> internal class InputFieldConverter : TypeConverter

AS> {
AS> // This method overrides CanConvertTo from TypeConverter. This is called when someone
AS> // wants to convert an instance of Triangle to another type. Here,
AS> // only conversion to an InstanceDescriptor is supported.
AS> public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
AS> {
AS> if (destinationType == typeof(InstanceDescriptor))
AS> {
AS> return true;
AS> }

AS> // Always call the base to see if it can perform the conversion.

AS> return base.CanConvertTo(context, destinationType);
AS> }

AS> // This code performs the actual conversion from a Triangle to an InstanceDescriptor.

AS> public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
AS> {
AS> if (destinationType == typeof(InstanceDescriptor))
AS> {
AS> ConstructorInfo ci = typeof(InputField).GetConstructor(new Type[]{typeof(string), typeof(string)});
AS> InputField t = (InputField) value;
AS> return new InstanceDescriptor(ci,new object[]{t.Name, t.Label});
AS> }

AS> // Always call base, even if you can't convert.

AS> return base.ConvertTo(context, culture, value, destinationType);
AS> }
AS> }
Странно, мне не помогло.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: массивы в коллекции
От: AlexSychev  
Дата: 07.12.05 17:41
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>Странно, мне не помогло.

Напиши по подробнее, в чем это выражается, потуму что я запостил кусок рабочего кода.

Единствеенное что приходит на ум, а ты не забыл поставить аттрибут DesignerSerializationVisibility
(см. код)


InputFieldCollection _inputFields = new InputFieldCollection();

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public InputFieldCollection InputFields
{
    get{ return _inputFields; }
}
Re[10]: массивы в коллекции
От: Lexsus Россия  
Дата: 08.12.05 07:57
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Здравствуйте, Lexsus, Вы писали:


L>>Странно, мне не помогло.

AS>Напиши по подробнее, в чем это выражается, потуму что я запостил кусок рабочего кода.

AS>Единствеенное что приходит на ум, а ты не забыл поставить аттрибут DesignerSerializationVisibility

AS>(см. код)

AS>

AS>InputFieldCollection _inputFields = new InputFieldCollection();

AS>[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
AS>public InputFieldCollection InputFields
AS>{
AS>    get{ return _inputFields; }
AS>}

AS>


Действительно забыл поставить.
Всё нормально когда я добавляю элементы к коллекции.
Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: массивы в коллекции
От: AlexSychev  
Дата: 08.12.05 11:08
Оценка: 3 (1) +1
Здравствуйте, Lexsus, Вы писали:

L>Действительно забыл поставить.

L>Всё нормально когда я добавляю элементы к коллекции.
L>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.

А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции?
Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
Re[12]: массивы в коллекции
От: Lexsus Россия  
Дата: 08.12.05 12:09
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Здравствуйте, Lexsus, Вы писали:


L>>Действительно забыл поставить.

L>>Всё нормально когда я добавляю элементы к коллекции.
L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.

AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции?

AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
ок. Попробую так сделать!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: массивы в коллекции
От: Lexsus Россия  
Дата: 08.12.05 14:23
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Здравствуйте, Lexsus, Вы писали:


L>>Действительно забыл поставить.

L>>Всё нормально когда я добавляю элементы к коллекции.
L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.

AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции?

AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.

Ура!!! Все получилось, спасибо за помощь!!!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: массивы в коллекции
От: Lexsus Россия  
Дата: 09.12.05 13:52
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Здравствуйте, Lexsus, Вы писали:


L>>Действительно забыл поставить.

L>>Всё нормально когда я добавляю элементы к коллекции.
L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.

AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции?

AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.

А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: массивы в коллекции
От: AlexSychev  
Дата: 09.12.05 14:05
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.


Напиши поподробнее что за элемент
Re[14]: массивы в коллекции
От: Lexsus Россия  
Дата: 09.12.05 14:19
Оценка:
Здравствуйте, AlexSychev, Вы писали:

AS>Здравствуйте, Lexsus, Вы писали:


L>>А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.


AS>Напиши поподробнее что за элемент

Написал вместо массива коллекцию. Написал свой TypeConverter. Добавляются элементы к коллекции на ура. А вот при редактировании выскакивает исключение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.