powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Типа, многомерная таблица. На основе чего ее лучше делать?
25 сообщений из 53, страница 1 из 3
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319180
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то на форуме подобный вопрос, но он касался внутренней архитектуры

Хочу сделать объект для отображения подобн ой таблицы

Фамилия имя отчество куча столбцов книги песни постановки ещё пара подобных столбцовИванов Пётр Алексеевич ... Петр-первый \n Обоз \n Сранья как любил тебя \n с днюхой вышел я из тюряги \n любовь-ромашка ...

Источником данных является MDTable (типа, Multi Dim - сам придумал и сделал). В ней ячейки содержат либо текст, либо дочернюю таблицу, в которой ячейки содержа либо текст, либ.. (рекурсия)


Все клетки - TextBlock,
Но при выделении строки она становится редактируемой - в ней все клетки представлены объектами TextBox, Datepicker, ComboBox и даже кнопки (мелкая, с крестиком - для удаления текущей строки) - юзер может редактировать, удалять, добавлять записи.

У меня 2 варианта решения:

>> На основе DataGrid. Объединение строк путем добавления дочерних таблиц(жуть, все столбцы будут независимыми в таких дочерних таблицах)
>> На основе Grid (проблема с добавлением строк в середину, проблема разницы кол-ва дочерних строк в разных столбцах)

P.s.,не говорите, будто жуткий интерфейс,
Во-первых, там всего таблица 5х5
Во-вторых OLAP (кто не знает олап, можете сводные таблицы в эксель вспомнить) всегда ровно именно в таких таблицах отображается и это самый удобный вариант из всего возможных.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319182
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
List<T>
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319205
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется речь идет о WРF?
если да, то DataGrid конечно вариант на много лучше. + там есть вертикальная и гори3онтальная виртуали3ация
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319218
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню. Хочу, чтобы таблица на несколько строк выглядела так
Я могу, конечно, внутрь одной ячейки пихать дочерние гриды, но как сделать так, чтобы строки в соседних ячейках коррелировали между собой - пока не придумал.
Если есть соображения, рад услышать
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319236
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandУточню. Хочу, чтобы таблица на несколько строк выглядела так
Я могу, конечно, внутрь одной ячейки пихать дочерние гриды, но как сделать так, чтобы строки в соседних ячейках коррелировали между собой - пока не придумал.
Если есть соображения, рад услышать
виртуали3ация важна? особенно по горизонтали?
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319238
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так же какого типа выделение вам нужно в этом гриде? бе3 выделения, построчно, по блочно (то есть блок и все подстроки) или построчно, по ячейкам.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319244
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesвиртуали3ация важна? особенно по горизонтали?
Честно говоря, даж не очень понимаю, что подразумевается под этим словом.
Грид нужен только для отображения данных. Если пользователь что-то внесёт, то эти данные напрямую отправляются в мой MDTable.

Roman Mejtesа так же какого типа выделение вам нужно в этом гриде? бе3 выделения, построчно, по блочно (то есть блок и все подстроки) или построчно, по ячейкам.
Выделение - только текущая ячейка.

Добавление новой строки я себе представляю так:
Щёлкаешь, например, по "физруку". И под ним появляются ещё ячейки с зауженной высотой - как знак, что туда можно что-то добавить. Наверно, так.
Может, в виде кнопки.. Например, это не пустые ячейки, а большая кнопочка.
Пока бы с отображением справиться))) А добавление - уже пустяк.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319247
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

Представленное на картинке представление стандартными средствами не реализуется. Только свой компонент грида с нуля писать. Задача трудоемкая. Может подумаете, как это представит иначе?
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319251
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вижу 2 пути:

- ItemsControl
- Grid (ColumnHeader)
- ScrollViewer
- VirtualizationStackРanel
- ItemsControl
- Grid
- Cell
- Cell
- Cell
- Cell

В качестве Grid'а можно исполь3овать и свою панель, в которой параметры можно будет Binding'ить. (то есть ра3меры привя3ать к существующим свойствам контрола, либо можно исполь3овать GridSizeSharing, чтоб параметры гридов совпадали.
Ну и в Cell надо будет определить всё поведение при выделении и настроить пере
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319253
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вижу 3 пути:
Путь номер 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
- ItemsControl
	- Grid (ColumnHeader)
	- ScrollViewer
        - VirtualizationStackРanel 
			- ItemsControl
				- Grid
					- Cell
					- Cell
					- Cell
					- Cell

В качестве Grid'а можно исполь3овать и свою панель, в которой параметры можно будет Binding'ить. (то есть ра3меры привя3ать к существующим свойствам контрола, либо можно исполь3овать GridSizeSharing, чтоб параметры гридов совпадали.
Ну и в Cell надо будет определить всё поведение при выделении и настроить переxоды фокуса ячеек.
Работы довольно много.

Путь номер 2:
Делать на ба3е 1 ItemsControl'а, в качестве элементов будут сра3у ячейка, в параметраx который будет сра3у определено иx положение в таблице, а в качестве панели будет выступать своя панель или Grid который будет прокручиваться в ScrollView, такое тоже довольно сложно сделать и не будет работать виртуали3ация.
Для этого метода надо будет еще делать свой CollectionView или какой то Wraррer

Путь номер 3:
Исполь3овать FlowDocument

Путь номер 4:
Рендерить и обрабатывать всё самому

Дла того, чтоб сделать такое нужно xорошо ра3бираться как работает:
ItemsControl и его потомки,
ItemContainerGenerator,
VirtualizingStackPanel,
Рanel (Measure, Arrage, Render),
ICollectionView
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319273
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttCharles Weyland,

Представленное на картинке представление стандартными средствами не реализуется. Только свой компонент грида с нуля писать. Задача трудоемкая. Может подумаете, как это представит иначе?
Не, я всё обдумал. Да, подобного компонента нет и задача действитетельно трудоёмкая. Поэтому решил спросить мнения форумчан.
Создание собственного компонента для меня задача не новая. Для winforms я уже создал на базе picturebox компонент datagrid, отображающий OLAP куб. Я прямо сурово линиями и "пеинтил".
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319282
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandhVosttCharles Weyland,

Представленное на картинке представление стандартными средствами не реализуется. Только свой компонент грида с нуля писать. Задача трудоемкая. Может подумаете, как это представит иначе?
Не, я всё обдумал. Да, подобного компонента нет и задача действитетельно трудоёмкая. Поэтому решил спросить мнения форумчан.
Создание собственного компонента для меня задача не новая. Для winforms я уже создал на базе picturebox компонент datagrid, отображающий OLAP куб. Я прямо сурово линиями и "пеинтил".
ну вот WРF по сути тоже самое только графике рендерная. Можно просто сделать Control, нафигачить Visual об_ектов (тверд. 3нак не работает) в этом контроле, чтоб не рендерить одно и тоже постоянно. Всё будет само рисоваться. Геометрия тут простая. Но это самый трудоемкий путь, много всего надо продумывать и делать прокрутку и т.д. Тогда как на ItemsControl'е можно сделать 3а счет шаблонов и генератора. Но и тут масса подводныx камней.
Но 1ый способ самый прои3водительный, а во втором доступны DataTemрlate'ы, что так же очень удобно.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319284
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandhVosttCharles Weyland,

Представленное на картинке представление стандартными средствами не реализуется. Только свой компонент грида с нуля писать. Задача трудоемкая. Может подумаете, как это представит иначе?
Не, я всё обдумал. Да, подобного компонента нет и задача действитетельно трудоёмкая. Поэтому решил спросить мнения форумчан.
Создание собственного компонента для меня задача не новая. Для winforms я уже создал на базе picturebox компонент datagrid, отображающий OLAP куб. Я прямо сурово линиями и "пеинтил".

Лучше уж взять HTML, трудоёмкость на пару порядков меньше, для реализации подобного, решается довольно легко.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319294
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttCharles Weylandпропущено...

Не, я всё обдумал. Да, подобного компонента нет и задача действитетельно трудоёмкая. Поэтому решил спросить мнения форумчан.
Создание собственного компонента для меня задача не новая. Для winforms я уже создал на базе picturebox компонент datagrid, отображающий OLAP куб. Я прямо сурово линиями и "пеинтил".

Лучше уж взять HTML, трудоёмкость на пару порядков меньше, для реализации подобного, решается довольно легко.

FlowDocument, внутри таблицы можно ра3местить UI элементы.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319319
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только сейчас появилась возможность проанализировать ваши ответы и советы.

Roman Mejtesвсё поведение при выделении и настроить пере
что-то там явно не дописано...
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319320
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, дописано.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319365
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandP.s.,не говорите, будто жуткий интерфейс,
Во-первых, там всего таблица 5х5
Во-вторых OLAP (кто не знает олап, можете сводные таблицы в эксель вспомнить) всегда ровно именно в таких таблицах отображается и это самый удобный вариант из всего возможных.
Да мы помним, что Вы пишете на халяву для какой-то одной школы. Вернее даже для одного человека.
Что типа дадите, тому он и рад будет :)

Вспомнилась "Психбольница в руках пациентов" :)
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319415
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЧто типа дадите, тому он и рад будет :)
Я и сюда выложу. Либо компонент, либо целиком программа может быть кому-то интересна.

В общем-то, я её пишу больше с целью ознакомиться с WPF по-человечески и чтобы в этой сфере у меня был небольшой, но законченный проект.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319563
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandЯ и сюда выложу. Либо компонент, либо целиком программа может быть кому-то интересна.

В общем-то, я её пишу больше с целью ознакомиться с WPF по-человечески и чтобы в этой сфере у меня был небольшой, но законченный проект.

Фармить опыт лучше в направлении того, чем реально пользуются люди. Придумать можно много чего, да что угодно вообще, но истинный путь — это отказываться от лишнего и выкидывать бредовые идеи, оставлять максимально простые и максимально эффективные. В этом и есть опыт, быстрее находить компромиссы, а не любой ценой, правдой и неправдой, до последнего пытаться вкорячить кривой нестандартный интерфейс, который уже заведомо по десятку причин, обречён.

Т.е. опыта поднять на таких вещах не получится, а вот потерять время — это да. Чем занимался последние несколько месяцев? Нннуу... пеинтил, понимаешь, нестандартный грид, у которого по сути нет строк (у каждой колонки они сугубо свои) — зачем?

Вспомнилось что-то про троллейбус из буханки...
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319644
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНннуу... пеинтил, понимаешь, нестандартный грид
А вот это я не по собственной воле делал. Во-первых, напеинтил я за 3 или 4 рабочих дня, а во-вторых, нормального, удовлетворяющего пользователя грида не было. Это был коммерческий проект. На работе делал.


hVosttФармить опыт лучше в направлении того, чем реально пользуются люди
Вы меня неправильно поняли.
Если бы меня это тяготило, я б не делал. Я увлечён программированием и хочется хорошему человеку сделать приятно. И мне приятно будет, если где-то моя программулина пригодилась.
Поэтому в любом случае при любом раскладе я этот грид добью)
Это всё равно, что человеку, играющему в танчики, говорить, что его танк 70 левел никому, кроме его и его товарища не интересен. Да он и не спорит. Всё равно хочет танк 70 левел.

А участникам форума, которые погрузились в вопрос и поделились советами - выражаю огромную благодарность))
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319976
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandskyANAЧто типа дадите, тому он и рад будет :)
Я и сюда выложу. Либо компонент, либо целиком программа может быть кому-то интересна.

В общем-то, я её пишу больше с целью ознакомиться с WPF по-человечески и чтобы в этой сфере у меня был небольшой, но законченный проект.
Всё же, ознакомление с WPF начинать лучше не сразу с создания кастомных замудрёных компонентов, а с использования стандартынх и этого модного MVVM. Ознакомление с WPF - это в первую очередь компоновка, стилизация и шаблонизация данных с байндингами. Потом уже визуальная шаблонизация и полноценные кастомные компоненты.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319977
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, Хвост прав.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319979
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandhVosttНннуу... пеинтил, понимаешь, нестандартный грид
А вот это я не по собственной воле делал. Во-первых, напеинтил я за 3 или 4 рабочих дня, а во-вторых, нормального, удовлетворяющего пользователя грида не было. Это был коммерческий проект. На работе делал.


hVosttФармить опыт лучше в направлении того, чем реально пользуются люди
Вы меня неправильно поняли.
Если бы меня это тяготило, я б не делал. Я увлечён программированием и хочется хорошему человеку сделать приятно. И мне приятно будет, если где-то моя программулина пригодилась.
Поэтому в любом случае при любом раскладе я этот грид добью)
Это всё равно, что человеку, играющему в танчики, говорить, что его танк 70 левел никому, кроме его и его товарища не интересен. Да он и не спорит. Всё равно хочет танк 70 левел.

А участникам форума, которые погрузились в вопрос и поделились советами - выражаю огромную благодарность))
Если понадобится совсем кастомный контрол, и шаблонизации данных и представления не хватит, то вам всё равно лучше начать с азов, с байндингов и компоновки. Всё равно придётся в кастомном компоненте прописывать байндинги через прикрепляемые свойства и свойства зависимостей (т. е. и эту тему со свойствами тоже поднять придётся, т. к. это не совсем те свойства, что в обычном ООП применяются).

Кстати, могу поделиться кодом, который позволяет удобно и быстро задавать размеры строк и столбцов в Grid (не DataGrid) в смешанном стиле (через числа, звёздочки, auto и дефолтное значение, аналогичное stretch "растянуть до краёв контейнера"):

Код: xml
1.
2.
3.
<Grid
    gh:GridHelpers.RowsHeightFormat="auto,200,2*,,,50,auto"
    gh:GridHelpers.ColumnsWidthFormat="12*,11*,20*">



Код: 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.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
public class GridHelpers
{
    // This class used the combination of approaches presented in https://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/
    // and in http://samondotnet.blogspot.ru/2012/03/wpf-grid-layout-simplified-using-rows.html .
    // I decide to drop out the properties that aren't needed for me - StarRows and StarColumns from the first link and Cell from the second one.
    // I introduced a new more generic properties RowsHeightFormat and ColumnsWidthFormat 
    // that allow to set up widths and heights with mixed styles (through numbers, asterisks, "auto" word, and default value) simultaneously.



    #region RowCount property

    /// <summary>
    /// Adds the specified number of rows to RowDefinitions. 
    /// Row's height has its default value like when you add a row like this: <![CDATA[<RowDefinition />]]>.
    /// </summary>
    public static readonly DependencyProperty RowCountProperty =
        DependencyProperty.RegisterAttached(
            "RowCount",
            typeof(int),
            typeof(GridHelpers),
            new PropertyMetadata(-1, RowCountChanged));

    public static int GetRowCount(DependencyObject target)
    {
        return (int)target.GetValue(RowCountProperty);
    }

    public static void SetRowCount(DependencyObject target, int value)
    {
        target.SetValue(RowCountProperty, value);
    }

    /// <summary>
    /// Adds rows.
    /// </summary>
    /// <param name="target"></param>
    /// <param name="e"></param>
    public static void RowCountChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (!(target is Grid) || (int)e.NewValue < 0)
            return;

        Grid grid = (Grid)target;

        grid.RowDefinitions.Clear();

        for (int i = 0; i < (int)e.NewValue; i++)
        {
            grid.RowDefinitions.Add(new RowDefinition());
        }
    }

    #endregion RowCount property

    #region ColumnCount property

    /// <summary>
    /// Adds the specified number of columns to ColumnDefinitions. 
    /// Column's width has its default value like when you add a column like this: <![CDATA[<ColumnDefinition />]]>.
    /// </summary>
    public static readonly DependencyProperty ColumnCountProperty =
        DependencyProperty.RegisterAttached(
            "ColumnCount",
            typeof(int),
            typeof(GridHelpers),
            new PropertyMetadata(-1, ColumnCountChanged));

    public static int GetColumnCount(DependencyObject target)
    {
        return (int)target.GetValue(ColumnCountProperty);
    }

    public static void SetColumnCount(DependencyObject target, int value)
    {
        target.SetValue(ColumnCountProperty, value);
    }

    /// <summary>
    /// Adds columns.
    /// </summary>
    /// <param name="target"></param>
    /// <param name="e"></param>
    public static void ColumnCountChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (!(target is Grid) || (int)e.NewValue < 0)
            return;

        Grid grid = (Grid)target;

        grid.ColumnDefinitions.Clear();

        for (int i = 0; i < (int)e.NewValue; i++)
        {
            grid.ColumnDefinitions.Add(new ColumnDefinition());
        }
    }

    #endregion ColumnCount property

    #region RowsHeightFormat property

    /// <summary>
    /// Sets the Height property for rows of the grid.
    /// </summary>
    public static readonly DependencyProperty RowsHeightFormatProperty =
        DependencyProperty.RegisterAttached(
            "RowsHeightFormat",
            typeof(string),
            typeof(GridHelpers),
            new PropertyMetadata(string.Empty, RowsHeightFormatChanged));

    public static string GetRowsHeightFormat(DependencyObject target)
    {
        return (string)target.GetValue(RowsHeightFormatProperty);
    }

    public static void SetRowsHeightFormat(DependencyObject target, string value)
    {
        target.SetValue(RowsHeightFormatProperty, value);
    }

    public static void RowsHeightFormatChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (!(target is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
            return;

        var grid = (Grid)target;
        var oldValue = e.OldValue as string;
        var newValue = e.NewValue as string;

        if (oldValue == null || newValue == null)
            return;

        if (oldValue != newValue)
        {
            grid.RowDefinitions.Clear();

            newValue
                .Split(new[] { ',' }, StringSplitOptions.None)
                .Select(ParseGridLength)
                .Select(gridLength =>
                {
                    if (gridLength.HasValue)
                        return new RowDefinition { Height = gridLength.Value };
                    else
                        return new RowDefinition();
                })
                .ToList()
                .ForEach(grid.RowDefinitions.Add);
        }
    }

    #endregion RowsHeightFormat property

    #region ColumnsWidthFormat property

    /// <summary>
    /// Sets the Width property for columns of the grid.
    /// </summary>
    public static readonly DependencyProperty ColumnsWidthFormatProperty =
        DependencyProperty.RegisterAttached(
            "ColumnsWidthFormat",
            typeof(string),
            typeof(GridHelpers),
            new PropertyMetadata(string.Empty, ColumnsWidthFormatChanged));

    public static string GetColumnsWidthFormat(DependencyObject target)
    {
        return (string)target.GetValue(ColumnsWidthFormatProperty);
    }

    public static void SetColumnsWidthFormat(DependencyObject target, string value)
    {
        target.SetValue(ColumnsWidthFormatProperty, value);
    }

    public static void ColumnsWidthFormatChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (!(target is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
            return;

        var grid = (Grid)target;
        var oldValue = e.OldValue as string;
        var newValue = e.NewValue as string;

        if (oldValue == null || newValue == null)
            return;

        if (oldValue != newValue)
        {
            grid.ColumnDefinitions.Clear();

            newValue
                .Split(new[] { ',' }, StringSplitOptions.None)
                .Select(ParseGridLength)
                .Select(gridLength =>
                {
                    if (gridLength.HasValue)
                        return new ColumnDefinition { Width = gridLength.Value };
                    else
                        return new ColumnDefinition();
                })
                .ToList()
                .ForEach(grid.ColumnDefinitions.Add);
        }
    }

    #endregion ColumnsLengthFormat property


    private static GridLength? ParseGridLength(string text)
    {
        text = text.Trim();

        // "Auto" grid length.
        if (text.ToLower() == "auto")
        {
            return GridLength.Auto;
        }

        // Proportional grid length set by asterisk.
        else if (text.Contains("*"))
        {
            double starNumber;

            // If there is only single "*" without a number then this is equivalent to "1*".
            if (text.Length == 1)
                starNumber = 1;
            else
                starNumber = double.Parse(text.Substring(0, text.IndexOf('*')), CultureInfo.InvariantCulture);

            return new GridLength(starNumber, GridUnitType.Star);
        }

        // This leaves the length for row or column with default value - when you set it in XAML like this: 
        // <RowDefinition /> or <ColumnDefinition /> - without defining the length actually.
        else if (String.IsNullOrEmpty(text))
            return null;

        // Grid length set by pixels.
        else
        {
            var pixelsCount = double.Parse(text, CultureInfo.InvariantCulture);
            return new GridLength(pixelsCount, GridUnitType.Pixel);
        }
    }
}

...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39319981
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если намешивать звёздочки и другие задания размера, то звёздочки будут делить только остаток свободного места от всех остальных размеров. Т. е. если всего доступно, например, ширины 500 единиц, а задано "450, 8*, 2*", то звёздочки разделят 500-450=50 единиц ширины в отношении 40 к 10.
...
Рейтинг: 0 / 0
Типа, многомерная таблица. На основе чего ее лучше делать?
    #39320012
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandВо-первых, напеинтил я за 3 или 4 рабочих дня

Ну да, ну да... Это из разряда «..и 8 шапок сошьём..».
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Типа, многомерная таблица. На основе чего ее лучше делать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]