powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid сделать такой
15 сообщений из 15, страница 1 из 1
DataGrid сделать такой
    #40035102
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я мало имею опыта с WPF, хочу реализовать одну идею для себя
Знаю есть такие компоненты devexpress - деньги не хочу платить, да и надо 1 раз

Задача реализовать что-то типа DataGrid но нестандартный:
Пример, проект имеет описание(описание можно скрыть или отобразить), проект содержит задачи(описание можно скрыть или отобразить) и т.д. 3 уровня

- проект
- описание
---- Задача
---- описание
------- подзадача
------- описание
------- подзадача
------- описание
------- подзадача
------- описание
---- Задача
---- описание
---- Задача
---- описание
- проект
- описание



Я пошел путем динамического создания компонентов на форме, знаю путь неправильный, вот и хочу узнать ваше мнение, как правильно.
Куда копать?
Может есть примеры проектов?
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035114
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая штука называется TreeGrid
Есть готовые решения, они несложные, можно и самому написать.
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035157
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Такая штука называется TreeGrid
Есть готовые решения, они несложные, можно и самому написать.

Готовые решения за деньги?
Самому написать с минимальными знаниями c# смогу?
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035164
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha
Готовые решения за деньги?
необязательно
Focha
Самому написать с минимальными знаниями c# смогу?
да, только знания WPF тоже нужны

https://www.codeproject.com/Articles/1213466/WPF-TreeGrid-using-a-DataGrid
кажется я вот этот юзал, но допиливал под себя
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035172
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не сильно заморачиваться, то данный результата можно достигнуть использую встроенную группировку в представлении.
Задавайте конкретные вопросы и получите конкретные ответы.
На вопрос, "как сделать, вот такой контрол?", могу дать только один ответ. Легко!
Дерево\группировку как я уже писал, можно сделать с помощью группировки в дефолтном представлении коллекции или делать собственное представление и всё это применять к существующему DataGrid, результат будет в точности такой как вам нужно.
Но группировка в стандартном представлении редкостное говнище, даже при не супер больших объёмах тормозит адово, а при огромные объёмах умирает намертво. Так же в режиме группировки не работает виртуализация.
Если хорошенько покопаться в этом разделе, можно найти описание как сделать по 2ому варианту, он сложнее, но на много более гибкий. Позволяет не только использовать иерархические коллекции, но и добавлять новые элементы в коллекцию на заданном уровне, управлять выделением, сортировкой (для иерархических списков сортировка должна действовать в рамках ветки, а не в рамках всего набора), поиском, фильтрацией и всем остальное.
не так давно одной контроле делал подобную вундервафлю, достаточно классический и тривиальный запрос, уж не знаю от куда у людей такая любовь к деревьям

почему мне не кто не дает таких задач? :( занимаюсь какой то херней :(
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035796
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Так мне нужно иметь возможность редактировать


Roman Mejtes,
Мне нравиться Ваш ответ, но мне он не помогает.
У меня есть задача вести список проектов/задач и подзадач(в удобном мне формате с возможность редактировать форму).
Хочу сделать инструмент который я могу изменить и развивать в любой момент
C# WPF очень давно изучал, опыта нет и сейчас понимаю, что на нем я могу реализовать свою идею.
У меня на сервере есть таблицы:
Код: sql
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.
create table project_management.projects
(
		 project_id   int not null identity(1, 1) primary key
		,project_priority   int not null
		,project_name   varchar(255) not null
		,project_description   varchar(max) null
		,project_client   varchar(255) null
		,project_from_date   date null
		,project_to_date   date null
		,project_status   varchar(255) not null default 'Ожидает'
)

create table project_management.tasks
(
		 project_id   int not null
		,task_id   int not null identity(1, 1) primary key
		,task_priority   int not null
		,task_name   varchar(255) not null
		,task_description   varchar(max) null
		,task_from_plan_date   date null
		,task_to_plan_date   date null
		,task_from_fact_date   date null
		,task_to_fact_date   date null		
		,task_responsible   varchar(255) null
		,task_status   varchar(255)	not null default 'Ожидает'
		
		FOREIGN KEY (project_id)  REFERENCES project_management.projects (project_id)
)



Я создал проект C# 4.7 WPF
Подключил entity framework
Код: 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.
 
    public partial class projects
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public projects()
        {
            this.tasks = new HashSet<tasks>();
        }
    
        public int project_id { get; set; }
        public int project_priority { get; set; }
        public string project_name { get; set; }
        public string project_description { get; set; }
        public string project_client { get; set; }
        public Nullable<System.DateTime> project_from_date { get; set; }
        public Nullable<System.DateTime> project_to_date { get; set; }
        public string project_status { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<tasks> tasks { get; set; }
    }


    public partial class tasks
    {
        public int project_id { get; set; }
        public int task_id { get; set; }
        public int task_priority { get; set; }
        public string task_name { get; set; }
        public string task_description { get; set; }
        public Nullable<System.DateTime> task_from_plan_date { get; set; }
        public Nullable<System.DateTime> task_to_plan_date { get; set; }
        public Nullable<System.DateTime> task_from_fact_date { get; set; }
        public Nullable<System.DateTime> task_to_fact_date { get; set; }
        public string task_responsible { get; set; }
        public string task_status { get; set; }
    
        public virtual projects projects { get; set; }
    }





Для реализации мне нужен datagrid
Код: xml
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.
<DataGrid DockPanel.Dock="Top" x:Name="testEF" AutoGenerateColumns="False">

            <DataGrid.Columns>
                
                <DataGridTextColumn Binding="{Binding project_id}"          Header="project id" Width="50" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding project_priority}"    Header="priority"   Width="50" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding project_name}"        Header="Название"   Width="*" />
                <DataGridTextColumn Binding="{Binding project_client}"      Header="Заказчик"   Width="*" />
                
                <DataGridTemplateColumn Header="Срок от" Width="100">
                    <DataGridTemplateColumn.CellTemplate >
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding Path=project_from_date}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                
                <DataGridTemplateColumn Header="Срок до" Width="100">
                        <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding Path=project_to_date}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTextColumn Binding="{Binding project_to_date}"      Header="Срок до"     Width="100" />
                
                <DataGridTemplateColumn Header="Статус" Width="90">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox SelectedValuePath="{Binding project_status}">
                                <ComboBoxItem IsSelected="True">Ожидает</ComboBoxItem>
                                <ComboBoxItem>Работаем</ComboBoxItem>
                                <ComboBoxItem>Завершен</ComboBoxItem>
                                <ComboBoxItem>Не делаем</ComboBoxItem>
                            </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>


                <DataGridTextColumn Binding="{Binding project_status}"      Header="Статус"     Width="90" />

            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate >
               
                <DataTemplate>
                    <DataGrid AutoGenerateColumns="False">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding project_description}"      Header="Заказчик"   Width="2000" />

                        </DataGrid.Columns>
                        <DataGrid.RowDetailsTemplate>
                            <DataTemplate>

                                <DataGrid AutoGenerateColumns="False" Name="grid_level_2" >
                                    <DataGridTextColumn Binding="{Binding task_id}"          Header="project id" Width="50" IsReadOnly="True" />
                                    <DataGridTextColumn Binding="{Binding task_priority}"    Header="priority"   Width="50" IsReadOnly="True" />

                                </DataGrid>
                            </DataTemplate>
                        </DataGrid.RowDetailsTemplate>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
            
        </DataGrid>



Я понял как вложить грид в грид, но дальше я не понимаю
К верхнему гриду я привязал данные, а как привязать данные к нижнему

Код: c#
1.
2.
3.
            monitoring_EF monitoring_EF = new monitoring_EF();

            testEF.ItemsSource = monitoring_EF.projects.ToList();




Поправьте меня если делаю неправильно или вы рекомендуете использовать не datagrid, а что?
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40035799
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha
Так мне нужно иметь возможность редактировать
посмотри компонент и исходники по ссылке
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037394
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Focha , как ответил Roman Mejtes , группировка это один из способов решения.
Но надо несколько по иному собирать информацию в общую коллекцию.
У элемента коллекции должны быть свойства через которые можно идентифицировать его группы.

Другой вариант, это как вы написали, создание иерархической коллекции и её Представление вложенными списочными элементами (в том числе DataGrid).
Так как на приведённом вами изображении нет явных сквозных колонок, то вам нужно использовать именно такой подход.
Он даст индивидуальные колонки для каждого уровня.

К сожалению, вы используете, мягко говоря, не типичнsq для C# и тем более для WPF стиль программирования - понять ваш код трудно.
Даже элементарные Правила Именования вы не соблюдаете.

Типовым для WPF является получение данных через Привязки к Контексту Данных.

По идее у вас должна быть некая коллекция типа ObservableCollection для данных по Проектам (назовём условно ObservableCollection<Project> Projects {get;}).
В каждом Проекте (Project) должна быть коллекция Задач (Task - это часто используемый для Net тип. Поэтому назовём их Job): ObservableCollection<Job> Jobs {get;}.
В каждой Задаче - коллекция подзадач: ObservableCollection<SubJob> SubJobs{get;}.

Для нужного вам оформления DataGrid плохо подходит, так как у него жёстко выделенные сквозные колонки.
Вам же , судя по рисунку, нужно наложение колонок.
Поэтому использую ItemsControl (но можно и ListBox).

В таком случае привязки коллекций будут выглядеть так:
Код: xml
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.
<ItemsControl ItemsSource="{Binding Projects}">
      <ItemsControl.ItemTemplate>
          <!-- Компоновка для  Project -->
          <DataTemplate TargetType="{x:Type local:Project}">
              <Grid .... >
                     ------------
                    <!-- Следующий уровень  -->
                    <ItemsControl ItemsSource="{Binding Jobs}">
                       <ItemsControl.ItemTemplate>
                            <!-- Компоновка для  Job -->
                            <DataTemplate TargetType="{x:Type local:Job}">
                                <Grid .... >
                                   ----------------
                                   <!-- Следующий уровень  -->
                                  <ItemsControl ItemsSource="{Binding SubJobs}">
                                      <ItemsControl.ItemTemplate>
                                          <!-- Компоновка для  SubJob -->
                                          <DataTemplate TargetType="{x:Type local:SubJob}                                </Grid>
                                            <Grid .... >
                                                --------------
                                            </Grid>
                                         </DataTemplate>
                                      </ItemsControl.ItemTemplate>
                                  </ItemsControl>
                                </Grid>
                           </DataTemplate>
                     </ItemsControl.ItemTemplate>
                  </ItemsControl>
              </Grid>
          </DataTemplate>
      </ItemsControl.ItemTemplate>
</ItemsControl>



Пишу здесь, скорее это не псевдокод.
Надеюсь поймёте саму идею.
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037694
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

Спасибо.
У меня опыта с C# ноль
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037773
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Focha
Eld Hasp,

Спасибо.
У меня опыта с C# ноль

Печально...
Вы вроде показывали выше код на Шарпе.

В WPF Решении в целом, собственно само WPF - это малая толика, единицы процентов от общего кода.
Основная часть это Модель + Репозиторий: Бизнес-логика и Хранение Данных.
Потом ViewModel, подготавливающая данные модели для WPF и передающая действия из GUI в Модель.
И это всё пишется на Шарпе.
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037816
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

В подобных случаях дататемплейты и стили рекомендуется не инлайнить, а выносить выше в область, где они будут созданы однократно, и ссылаться на них посредством StaticResource - при инлайновом объявлении темплейты и стили будут заново пересоздаваться при перезаполнении ItemsControl, что может быть затратно при достаточно сложной структуре темплейтов/стилей, плюс может привести к утечкам памяти (с другой стороны, рекомендуется размещать их максимально близко к месту использования, чтобы минимизировать путь поиска по логическому дереву - такая вот дилемма).
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037996
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, не знал.
Думал это равнозначный.
На практике создавал в ресурсах, но с целью разгрузить XAML Окна.

И подумал сейчас.
ItemTemplate - это же шаблон.
Он не создаёт непосредственно элементов.
Это просто фабрика.
По идее не должно быть разницы, ссылается фабрика на экземпляр в ресурсах или на анонимный экземпляр заданный в самом шаблоне.
Спорить не буду - так "мысли в слух".
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40037999
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, дошло...
Фабрика будет создавать первый уровень.
А для каждого следующего уровня будет создаваться своя фабрика со своими анонимными экземплярами.
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40044438
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для HeaderedItemsControl насколько помню, можно задать view. Вложенные ItemsControl по мне кривовато выглядят.
...
Рейтинг: 0 / 0
DataGrid сделать такой
    #40044502
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока разбираюсь во всем, что вы написали.
Попозже, если дело пойдет, выложу готовый результат
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid сделать такой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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