Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
acrilige
24 / 24 / 7
Регистрация: 03.03.2011
Сообщений: 35
1

TypeConvertor для массива

26.04.2011, 19:30. Просмотров 621. Ответов 0
Метки нет (Все метки)

Имеется структура по аналогии с PointF:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public struct MyPointF
    {
        private float x;
        private float y;
 
        public MyPointF(float x, float y)
        {
            this.x = (float)Math.Round(x, 2); ;
            this.y = (float)Math.Round(y, 2);
        }
 
        public float X
        {
            get { return x; }
            set { x = (float)Math.Round(value, 2); }
        }
 
        public float Y
        {
            get { return y; }
            set { y = (float)Math.Round(value, 2); }
        }
 
        public override string ToString()
        {
            return String.Format("{0} : {1}", X, Y);
        }
    }
Есть контрол PropertyGrid, в котором должны отображаться элементы MyPointF.

Написал класс, производный от TypeConverter для отображения:

MyPointFTypeConverter
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class MyPointFConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
                return true;
 
            return base.CanConvertFrom(context, sourceType);
        }
 
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(MyPointF))
                return true;
 
            return base.CanConvertTo(destinationType);
        }
 
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                string xString = ((string)value).Substring(0, ((string)value).IndexOf(':'));
                float x = float.Parse(xString);
                string yString = ((string)value).Substring(((string)value).IndexOf(':') + 1);
                float y = float.Parse(yString);
                return new MyPointF(x, y);
            }
 
            return base.ConvertFrom(context, culture, value);
        }
 
        public override object ConvertTo(ITypeDescriptorContext context,
            CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
                return ((MyPointF)value).ToString();
 
            return base.ConvertTo(value, destinationType);
        }
 
        public override object CreateInstance(ITypeDescriptorContext context,
            System.Collections.IDictionary propertyValues)
        {
            return new MyPointF((float)propertyValues["X"], (float)propertyValues["Y"]);
        }
 
        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, 
            object value, Attribute[] attributes)
        {
            PropertyDescriptorCollection collection;
            string[] props = new string[] { "X", "Y" };
            collection = TypeDescriptor.GetProperties(typeof(MyPointF), attributes);
            return collection.Sort(props);
        }
 
        public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
        {
            return true;
        }
 
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return true;
        }
    }


Теперь возникла необходимость в отображении массива этих точек (т.е тип MyPointF[])

Пытался написать конвертер, получилось вот что:
MyPointFArrayTypeConverter
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MyPointFArrayConverter : TypeConverter
    {
        private class MyPointFPropertyDescriptor : TypeConverter.SimplePropertyDescriptor
        {
            private int index;
 
            public MyPointFPropertyDescriptor(Type arrayType, Type itemType, string name, int index) :
                base(arrayType, name, itemType)
            {
                this.index = index;
            }
 
            public override object GetValue(object component)
            {
                if (component is MyPointF[])
                {
                    MyPointF[] array = (MyPointF[])component;
                    if (array.Length > this.index)
                        return array[index];
                }
                
                return null;
            }
 
            public override void SetValue(object component, object value)
            {
                if (component is MyPointF[])
                {
                    MyPointF[] array = (MyPointF[])component;
                    if (array.Length > this.index)
                        array[index] = (MyPointF)value;
                }
            }
        }
 
        public override object ConvertTo(ITypeDescriptorContext context,
            CultureInfo culture, object value, Type destinationType)
        {
            return "Мн-во координат...";
        }
 
        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context,
            object value, Attribute[] attributes)
        {
            PropertyDescriptor[] props = null;
 
            if (value is MyPointF[])
            {
                MyPointF[] array = (MyPointF[])value;
                props = new PropertyDescriptor[array.Length];
 
                Type arrayType = typeof(MyPointF[]);
                Type itemType = typeof(MyPointF);
 
                for (int i = 0; i < props.Length; i++)
                    props[i] = new MyPointFPropertyDescriptor(arrayType, itemType, "Точка " + i, i);
            }
 
            return new PropertyDescriptorCollection(props);
        }
 
        public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
        {
            return true;
        }
 
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return true;
        }
    }


Отлично, массив в propertyGrid отображается нормально, но как можно реализовать изменение элементов этого массива?

Само свойство:

C#
1
2
3
4
5
6
7
private MyPointF[] _points;
[TypeConverter(typeof(MyPointFArrayConverter))]
public MyPointF[] Points
{
    get { return _points; }
    set { _points = value; }
}
Добавлено через 2 часа 25 минут
Проблема решилась.
Если кому интересно:

MyPointFConverter подходит и для массива, достаточно перед структурой MyPointF указать:
C#
1
[TypeConverter(typeof(MyPointFConverter))]
Перед свойством же и вовсе не нужно указывать.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2011, 19:30
Ответы с готовыми решениями:

Алгоритм для формирования нового одномерного массива из элементов заданного массива
Cоставить алгоритм для формирование нового одномерного массива из элементов...

Подгрузить 1 строку двухмерного массива, в ф-цию для одномерного массива
Здравствуйте. Вот играюсь я с массивами и не совсем хватает мне знаний в этом...

Как вывести для каждого элемента массива t по одному (любому) из элементов массива T
Здравствуйте, подскажите пожалуйста как вывести для каждого элемента массива t...

Метод для сортировки массива, методом пузырька - индекс находился вне границ массива
Доброго времени суток. Я изучаю С# недавно. Прочел похожие темы на форму, но...

Для каждого массива в диалоге ввести размер массива и элементы массива и найти сумму и среднее арифметическое значение для каждого массива
даны 3 различных массива целых чисел(размер каждого не должен превышать 15)....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2011, 19:30

Даны два одномерных массива размера n и s/ для первого массива вычислить сумму четных элеменртов, для второго - сумма нечетных элементов
Даны два одномерных массива размера n и s/ для первого массива вычислить сумму...

Для массива x(n) определить значение максимального эллемента массива и поменять его с первым элементом массива
Для массива x(n) определить значение максимального эллемента массива и поменять...

Создать два массива. Вычислить количество тех элементов каждого массива, для которых выполняется неравенство: 2<элемент массива<10
помогите,пожалуйста! есть вот такие задания...ОЧЕНЬ надо на завтра... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru