У меня есть коллекция 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, при редактировании массивов изменения не сохраняются. В чем проблема? Заранее благодарен!
Здравствуйте, Константин Ленин, Вы писали:
КЛ>потому, что это структура — value type, то есть она копируется и уже ее копияч изменяется в CollectionEditor
Это я ошибся, GraphInfo у меня не структура, а класс.
Здравствуйте, Lexsus, Вы писали:
L>У меня есть коллекция GraphInfoCollection. Элементами данной коллекции является структура GraphInfo.
skip L>Так вот, вопрос,в CollectionEditor, при редактировании массивов изменения не сохраняются. В чем проблема? Заранее благодарен!
А что это за коллекция? Посмотри, чтобы с ней выполнялись такие условия:
1)Она должна иметь строго типизированный индексатор.
2)Иметь метод Add.
3)GraphInfo пометь как сериализируемый
Также попробуй пометить XData аттрибутом DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
Надеюсь, поможет
Здравствуйте, wishful, Вы писали:
W>А что это за коллекция? Посмотри, чтобы с ней выполнялись такие условия: W>1)Она должна иметь строго типизированный индексатор. W>2)Иметь метод Add. W>3)GraphInfo пометь как сериализируемый
W>Также попробуй пометить XData аттрибутом DesignerSerializationVisibility(DesignerSerializationVisibility.Content) W>Надеюсь, поможет
Что значит строго типизированый индексатор?
Здравствуйте, 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;
}
}
}
Сделал всё как вы советовали, всё равно не выходит.
Здравствуйте, Lexsus, Вы писали:
L>Здравствуйте, wishful, Вы писали: W>>Посмотрите здесь. Может поможет L>Спасибо за ссылку, буду смотреть.
Ссылка не очень информативная, наступал на теже грабли, а тема что тебе нужна уже обсуждалась на форуме.
Помоему решения я нашел имеено здесь.
вот как это у меня получилось
1) сам объект
[TypeConverter(typeof(InputFieldConverter))]
public class InputField
{
private string _name = "";
private string _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);
}
}
Здравствуйте, 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> }
Странно, мне не помогло.
Здравствуйте, AlexSychev, Вы писали:
AS>Здравствуйте, Lexsus, Вы писали:
L>>Странно, мне не помогло. AS>Напиши по подробнее, в чем это выражается, потуму что я запостил кусок рабочего кода.
AS>Единствеенное что приходит на ум, а ты не забыл поставить аттрибут DesignerSerializationVisibility AS>(см. код)
AS>
Действительно забыл поставить.
Всё нормально когда я добавляю элементы к коллекции.
Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
Здравствуйте, Lexsus, Вы писали:
L>Действительно забыл поставить. L>Всё нормально когда я добавляю элементы к коллекции. L>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции?
Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
Здравствуйте, AlexSychev, Вы писали:
AS>Здравствуйте, Lexsus, Вы писали:
L>>Действительно забыл поставить. L>>Всё нормально когда я добавляю элементы к коллекции. L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции? AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
ок. Попробую так сделать!
Здравствуйте, AlexSychev, Вы писали:
AS>Здравствуйте, Lexsus, Вы писали:
L>>Действительно забыл поставить. L>>Всё нормально когда я добавляю элементы к коллекции. L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции? AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
Здравствуйте, AlexSychev, Вы писали:
AS>Здравствуйте, Lexsus, Вы писали:
L>>Действительно забыл поставить. L>>Всё нормально когда я добавляю элементы к коллекции. L>>Проблемы начинаются когда я в этом же CollectionEditor открываю ещё один для редактирования массива. При нажатии кнопки Ок элементы к коллекции не добавляются.
AS>А что тебе мешает сделать коллекцию вместо массива и повторить все тоже самое как и для первоначальной коллекции? AS>Только один ньюанс, и для класса второй коллекции потребуется написать свой TypeConverter.
А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.
Здравствуйте, Lexsus, Вы писали:
L>А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.
Здравствуйте, AlexSychev, Вы писали:
AS>Здравствуйте, Lexsus, Вы писали:
L>>А в чем может быть проблема? При редактировании элемента в CollectionEditor выскакивает исключение StackOverflowException.
AS>Напиши поподробнее что за элемент
Написал вместо массива коллекцию. Написал свой TypeConverter. Добавляются элементы к коллекции на ура. А вот при редактировании выскакивает исключение.