Как создать такое представление в WPF DataGridView C#, которое отображает строки родительской таблицы и строки дочерней ⇐ C#
Как создать такое представление в WPF DataGridView C#, которое отображает строки родительской таблицы и строки дочерней
У меня есть база данных SQL Server с именем EmployeesDB, которая содержит следующие 4 таблицы:
[*]Сотрудники Таблица, которая в этом примере является родительской таблицей. Таблица [*]EmployeesContacts. Это дочерняя таблица сотрудников, содержащих номера телефонов сотрудников, поскольку большинство сотрудников имеют более одного телефонного номера. [*]EmployeesLanguages Таблица, которая является дочерней таблицей сотрудников, содержащих языки сотрудников и их способность говорить, читать и писать на этих языках. Таблица [*]EmployeesDuties. Это дочерняя таблица сотрудников, выполняющих обязанности всех сотрудников компании. Вот диаграмма базы данных
А вот скрипт базы данных
USE [EmployeesDB] ИДТИ /****** Объект: Таблица [dbo].[Сотрудники] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[Сотрудники]( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [Имя] [nvarchar](50) NULL, [Фамилия] [nvarchar](50) NULL, [Возраст] [int] NULL, [Пол] [nvarchar](10) NULL, [Электронная почта] [nvarchar](200) NULL, ОГРАНИЧЕНИЕ [PK_Employees] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИРОВАН ( [ID сотрудника] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[СотрудникиКонтакты] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[СотрудникиКонтакты]( [EmployeeID] [int] НЕ NULL, [Телефон] [nvarchar](12) НЕ NULL, ОГРАНИЧЕНИЕ [PK_EmployeesContacts] КЛАСТЕРИЗИРОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [Телефон] АСЦ )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[EmployeesDuties] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[EmployeesDuties]( [EmployeeID] [int] НЕ NULL, [EmployeeDutyID] [int] IDENTITY(1,1) NOT NULL, [Обязанность] [nvarchar](20) НЕ НУЛЬ, ОГРАНИЧЕНИЕ [PK_EmployeesDuties] КЛАСТЕРНЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [EmployeeDutyID] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[EmployeesLanguages] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[EmployeesLanguages]( [EmployeeID] [int] НЕ NULL, [EmployeeLanguageID] [int] IDENTITY(1,1) NOT NULL, [ИмяЯзыка] [nvarchar](50) NULL, [TalkingAbility] [nvarchar](20) NULL, [ReadingAbility] [nvarchar](20) NULL, [WritingAbility] [nvarchar](20) NULL, ОГРАНИЧЕНИЕ [PK_EmployeesLanguages] КЛАСТЕРИЗИРОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [EmployeeLanguageID] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ ALTER TABLE [dbo].[EmployeesContacts] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesContacts_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ALTER TABLE [dbo].[EmployeesContacts] ПРОВЕРЬТЕ ОГРАНИЧЕНИЕ [FK_EmployeesContacts_Employees] ИДТИ ALTER TABLE [dbo].[EmployeesDuties] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesDuties_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ИЗМЕНИТЬ ТАБЛИЦУ [dbo].[EmployeesDuties] ПРОВЕРИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesDuties_Employees] ИДТИ ALTER TABLE [dbo].[EmployeeLanguages] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployesLanguages_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ALTER TABLE [dbo].[EmployeesLanguages] ПРОВЕРЬТЕ ОГРАНИЧЕНИЕ [FK_EmployeesLanguages_Employees] ИДТИ А для XAML и C# это просто окно с WPF DataGridView
Невозможное для меня пришло, когда я обратился к пользовательскому интерфейсу, в котором мне хотелось, чтобы все данные отображались в одном DataGridView, чтобы я мог воспользоваться преимуществами функций DataGridView, такими как фильтр, сортировка, поиск и т. д.
Вот пример желаемого представления, в котором все строки находятся в развернутом режиме
А вот описание таблицы, которой принадлежат столбцы
Мне нужны были следующие варианты поведения и функции:
[*]Когда внутри строк есть подстроки (например, у сотрудника с большим количеством телефонных номеров):
a) Чтобы отобразить этот заголовок строки (значок свернутой строки) слева, когда нет наведения курсора мыши и кнопки «Развернуть все», установлено значение false, как показано на рисунке ниже (строки 1, 2).
b) Чтобы отобразить заголовок этой строки (значок расширенной строки) слева когда они навели указатель мыши или когда кнопка «Развернуть все ToggleButton» имеет значение True, как на рисунке ниже (строка 3).
c) Чтобы отобразить этот заголовок строки (строка не имеет значка подстрок) в Левая сторона, когда строки не имеют подстрок, как показано на рисунке ниже. (Ряд 3, 4).
Вот изображение того, как выглядит DatagridView при наведении курсора мыши и как выглядят заголовки строк, описанные выше
[*]Чтобы отобразить надпись «Нажмите, чтобы добавить новую строку» в конце каждой подстроки и в конце родительской строки, как показано на рисунках выше. [*]Когда я фильтрую примеры сотрудников по обязанностям «Рекламодатель», фильтр отображает полные данные со всеми подстроками, как показано на рисунке ниже (столбец «Фильтрация по обязанностям»).
Вот изображение того, как DatagridView выглядит после фильтрации
[*]Когда DataGridView фильтруется, сортируется или выполняется поиск, кнопка «Развернуть все» имеет значение True, как показано на рисунке выше. [*]Родительские строки должны иметь уникальную границу, как показано на рисунке выше. [*]Пустые места, где нет ничего, что написано ниже имени и фамилии, вместо пробелов вместо ячеек, как на рисунке выше.
При всех своих усилиях я искал в Google что-нибудь подобное и ничего не нашел. Пробовал SQL Server View, но безуспешно… Буду очень признателен за любую помощь в этом вопросе.
У меня есть база данных SQL Server с именем EmployeesDB, которая содержит следующие 4 таблицы:
[*]Сотрудники Таблица, которая в этом примере является родительской таблицей. Таблица [*]EmployeesContacts. Это дочерняя таблица сотрудников, содержащих номера телефонов сотрудников, поскольку большинство сотрудников имеют более одного телефонного номера. [*]EmployeesLanguages Таблица, которая является дочерней таблицей сотрудников, содержащих языки сотрудников и их способность говорить, читать и писать на этих языках. Таблица [*]EmployeesDuties. Это дочерняя таблица сотрудников, выполняющих обязанности всех сотрудников компании. Вот диаграмма базы данных
А вот скрипт базы данных
USE [EmployeesDB] ИДТИ /****** Объект: Таблица [dbo].[Сотрудники] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[Сотрудники]( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [Имя] [nvarchar](50) NULL, [Фамилия] [nvarchar](50) NULL, [Возраст] [int] NULL, [Пол] [nvarchar](10) NULL, [Электронная почта] [nvarchar](200) NULL, ОГРАНИЧЕНИЕ [PK_Employees] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИРОВАН ( [ID сотрудника] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[СотрудникиКонтакты] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[СотрудникиКонтакты]( [EmployeeID] [int] НЕ NULL, [Телефон] [nvarchar](12) НЕ NULL, ОГРАНИЧЕНИЕ [PK_EmployeesContacts] КЛАСТЕРИЗИРОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [Телефон] АСЦ )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[EmployeesDuties] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[EmployeesDuties]( [EmployeeID] [int] НЕ NULL, [EmployeeDutyID] [int] IDENTITY(1,1) NOT NULL, [Обязанность] [nvarchar](20) НЕ НУЛЬ, ОГРАНИЧЕНИЕ [PK_EmployeesDuties] КЛАСТЕРНЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [EmployeeDutyID] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ /****** Объект: Таблица [dbo].[EmployeesLanguages] ******/ УСТАНОВИТЕ ANSI_NULLS ВКЛ. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[EmployeesLanguages]( [EmployeeID] [int] НЕ NULL, [EmployeeLanguageID] [int] IDENTITY(1,1) NOT NULL, [ИмяЯзыка] [nvarchar](50) NULL, [TalkingAbility] [nvarchar](20) NULL, [ReadingAbility] [nvarchar](20) NULL, [WritingAbility] [nvarchar](20) NULL, ОГРАНИЧЕНИЕ [PK_EmployeesLanguages] КЛАСТЕРИЗИРОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [EmployeeLanguageID] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ОСНОВНОЙ] ИДТИ ALTER TABLE [dbo].[EmployeesContacts] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesContacts_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ALTER TABLE [dbo].[EmployeesContacts] ПРОВЕРЬТЕ ОГРАНИЧЕНИЕ [FK_EmployeesContacts_Employees] ИДТИ ALTER TABLE [dbo].[EmployeesDuties] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesDuties_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ИЗМЕНИТЬ ТАБЛИЦУ [dbo].[EmployeesDuties] ПРОВЕРИТЬ ОГРАНИЧЕНИЕ [FK_EmployeesDuties_Employees] ИДТИ ALTER TABLE [dbo].[EmployeeLanguages] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_EmployesLanguages_Employees] FOREIGN KEY([EmployeeID]) ССЫЛКИ [dbo].[Сотрудники] ([EmployeeID]) ИДТИ ALTER TABLE [dbo].[EmployeesLanguages] ПРОВЕРЬТЕ ОГРАНИЧЕНИЕ [FK_EmployeesLanguages_Employees] ИДТИ А для XAML и C# это просто окно с WPF DataGridView
Невозможное для меня пришло, когда я обратился к пользовательскому интерфейсу, в котором мне хотелось, чтобы все данные отображались в одном DataGridView, чтобы я мог воспользоваться преимуществами функций DataGridView, такими как фильтр, сортировка, поиск и т. д.
Вот пример желаемого представления, в котором все строки находятся в развернутом режиме
А вот описание таблицы, которой принадлежат столбцы
Мне нужны были следующие варианты поведения и функции:
[*]Когда внутри строк есть подстроки (например, у сотрудника с большим количеством телефонных номеров):
a) Чтобы отобразить этот заголовок строки (значок свернутой строки) слева, когда нет наведения курсора мыши и кнопки «Развернуть все», установлено значение false, как показано на рисунке ниже (строки 1, 2).
b) Чтобы отобразить заголовок этой строки (значок расширенной строки) слева когда они навели указатель мыши или когда кнопка «Развернуть все ToggleButton» имеет значение True, как на рисунке ниже (строка 3).
c) Чтобы отобразить этот заголовок строки (строка не имеет значка подстрок) в Левая сторона, когда строки не имеют подстрок, как показано на рисунке ниже. (Ряд 3, 4).
Вот изображение того, как выглядит DatagridView при наведении курсора мыши и как выглядят заголовки строк, описанные выше
[*]Чтобы отобразить надпись «Нажмите, чтобы добавить новую строку» в конце каждой подстроки и в конце родительской строки, как показано на рисунках выше. [*]Когда я фильтрую примеры сотрудников по обязанностям «Рекламодатель», фильтр отображает полные данные со всеми подстроками, как показано на рисунке ниже (столбец «Фильтрация по обязанностям»).
Вот изображение того, как DatagridView выглядит после фильтрации
[*]Когда DataGridView фильтруется, сортируется или выполняется поиск, кнопка «Развернуть все» имеет значение True, как показано на рисунке выше. [*]Родительские строки должны иметь уникальную границу, как показано на рисунке выше. [*]Пустые места, где нет ничего, что написано ниже имени и фамилии, вместо пробелов вместо ячеек, как на рисунке выше.
При всех своих усилиях я искал в Google что-нибудь подобное и ничего не нашел. Пробовал SQL Server View, но безуспешно… Буду очень признателен за любую помощь в этом вопросе.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение