Практическое задание по
прикладному программированию
на тему:
ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ
Преподаватель:
Студент:
Группа:
Санкт-Петербург
2010
Содержание
1. Формулировка задания
Практическое задание на тему «Проектирование БД» подразумевает выполнение следующих задач:
определение объектов и их характеристик, которые необходимо хранить в БД (определение исходных данных для проектирования структуры БД);
разработка структуры БД;
разработка уровня доступа к данным;
создание пользовательского интерфейса для работы с БД.
2. Описание БД
Для хранения БД были выбраны объекты, принадлежащие к области «Информационные материалы». Ключевым объектов хранения является информационный материал, включающий следующие характеристики:
название;
категорию информационного материала;
текстовое содержание материала;
видеоматериалы;
изображения;
аннотация к материалу;
указание на того, кто добавил материал;
дата публикации;
комментарии;
количество просмотров;
количество голосов;
общий рейтинг материала (сумма всех опубликованных пользователями рейтингов);
флаг, доступны ли комментарии к материалу или нет;
флаг, определяющий в архиве или нет материал;
флаг, определяющий одобрен ли к публикации материал.
На основе исходных данных по предметной области выделены следующие сущности:
информационный материал;
категория информационного материала;
комментарий;
видеоматериал;
изображение.
По сущностям построены таблицы со следующими полями:
Таблица InfoMat_Category
Название
Тип даных
PK
ID_Category
bigint
Name
nchar(30)
Description
nvarchar(max)
Image
image
ParentCategory
bigint
Таблица InfoMat_InfoMaterial
Таблица InfoMat_Image
Таблица InfoMat_Video
Таблица InfoMat_Comment
Связи между таблицами представлены на рисунке 1.
Рисунок 1 — Структура БД
–PAGE_BREAK–3. Описание интерфейса программы
3.1. Окно «Категории информационных материалов»
После запуска программы появляется окно пользовательского интерфейса «Категории информационных материалов», представленное на рисунке 2.
Основными элементы окна, выделенные на рисунке прямоугольниками:
Область, в которой отображаются категории информационных материалов.
Кнопка фильтрации (выбора по признакам) информационных материалов.
Кнопка удаления выбранной категории.
Кнопка добавления новой категории.
Кнопка сохранения сделанных изменений.
Кнопка возврата из подкатегории, если пользователь просматривает подкатегории выбранной категории.
Кнопка, предоставляющая ряд действий: фильтрация, сортировка категорий.
Область, включающая два текстовых поля и кнопку выбора изображения. Эта область используется для редактирования существующих категорий и ввода информации для добавляемых категорий.
Рисунок 2 — Окно «Категории информационных материалов»
Copyrights (авторские права).
Область для выбора изображения. После нажатия на кнопку в этой области появляется диалоговое окно, предоставляющее возможность выбора изображения.
Область, в которой отображена подсказка по перемещению по категориям.
3.2. Окно «Информационные материалы»
После двойного щелчка по категории, не имеющей подкатегории (в том случае, если она имеет подкатегории, осуществляется переход к подкатегориям), открывается окно пользовательского интерфейса «Информационные материалы», представленное на рисунке 3.
Основные элементы окна, выделенные на рисунке прямоугольниками:
Область, представляющая собой краткую информацию об информационном материале: изображение, название, краткое описание, дату публикации, количество просмотров, рейтинг материала.
Кнопка просмотра выбранного информационного материала. Также просмотр материала можно осуществлять двойным щелчком по нему.
Кнопка удаления выбранного материала.
Кнопка редактирования выбранного информационного материала.
Кнопка добавления нового информационного материала.
Рисунок 3 — Окно «Информационные материалы»
3.3. Окно «Информационный материал»
Для просмотра информационного материала, т.е. для просмотра полной информации о нём: полного текста, комментариев, необходимо нажать кнопку 2, после чего появляется окно пользовательского интерфейса «Информационный материал». Это окно представлено на рисунке 4.
Основные элементы окна, выделенные на рисунке прямоугольниками:
Область, содержащая основную информацию материала.
Область, в которой отображаются комментарии.
Кнопка удаления выбранного комментария.
Область, предоставляющая возможность пользователю оставить свой комментарий.
Кнопка, добавляющая набранный комментарий к уже существующим.
Рисунок 4 — Окно «Информационный материал»
3.4. Окно «Редактирование информационного материала»
Для редактирования информационного материала необходимо в окне «Информационные материалы» нажать кнопку 4, после чего появится окно пользовательского интерфейса «Редактирование информационного материала». Окно представлено на рисунке 5.
В окне имеется возможность редактирования соответствующих текстовых полей и выбора нового изображения для информационного материала. Для подтверждения сделанных изменений необходимо нажать кнопку OK.
Рисунок 5 — Окно «Редактирование информационного материала»
3.5. Окно «Добавление информационного материала»
Для добавления информационного материала необходимо в окне «Информационные материалы» нажать кнопку 5, после чего появится окно пользовательского интерфейса «Добавление информационного материала». Окно представлено на рисунке 6.
В окне имеется возможность заполнения соответствующих текстовых полей и выбора изображения для информационного материала. Для подтверждения добавления нового информационного материала необходимо нажать кнопку OK.
Рисунок 6 — Окно «Добавление информационного материала»
3.6. Окно «Фильтрация информационных материалов»
При щелчке по кнопке 2 окна пользовательского интерфейса «Категории информационных материалов», представленного на рисунке 2, появляется окно пользовательского интерфейса «Фильтрация информационных материалов», показанное на рисунке 7.
Рисунок 7 — Окно «Фильтрация информационных материалов»
Основные элементы окна, выделенные на рисунке прямоугольниками:
Область, в которой задаются параметры фильтрации информационных материалов.
Текстовое поле, в котором можно задать часть названия или полное название информационного материала.
Параметр фильтрации, определяющий такой критерий фильтрации, как «Рейтинг» или «Популярность». «Рейтинг» — это средняя оценка пользователями материала. «Популярность» — это количество просмотров пользователями материала.
Поле, в котором задается количество выводимых в результате фильтрации записей. Введенный по умолчанию 0 означает, что нужно выводить все записи фильтрации.
Направление сортировки: начиная с лучших (стрелка на зеленом фоне) или начиная с худших (стрелка на красном фоне) (по «Рейтингу» или «Популярности»).
Дата публикации позволяет задать календарным период, за который он хочет просмотреть материалы.
Кнопка фильтрации информационных материалов по заданным параметрам.
Область, в которой отображаются результаты фильтрации.
Все кнопки окон имеют всплывающие подсказки, позволяющий пользователю быстро освоить интерфейс.
продолжение
–PAGE_BREAK–4. Перечень запросов LINQ to Entities, используемых в приложении
В результате объектно-реляционного отображения (маппинга) (object-relational mapping, ORM) по средствам ADO.NET Entity Framework сформировалась объектная модель, представленная на рисунке 7.
Рисунок 7 — Объектная модель приложения
Запросы к БД осуществлялись уже не напрямую, а через используемый ORM с применением LINQ to Entities (Language-Integrated Query).
Для взаимодействия с БД в приложении были написаны следующие запросы:
получение категорий:
fromc in_entities.Categories
wherecategoryId == 0? (c.ParentCategory == categoryId || c.ParentCategory == null): (c.ParentCategory == categoryId)
select c
получение информационных материалов:
fromim in_entities.InfoMaterials.Include(«Image»).Include(«Comments»)
whereim.Category.ID_Category == categoryId
selectim
получение информационного материала:
(fromim in_entities.InfoMaterials.Include(«Image»).Include(«Comments»)
whereim.ID_InfoMaterial == materialId
selectim).First()
многопараметрический запрос фильтрации информационных материалов:
varinfoMaterials = fromim in_entities.InfoMaterials.Include(«Image»)
where(im.PublishDate >= filter.DateFrom && im.PublishDate
selectim;
if(filter.NumberOfRows
filter.NumberOfRows = int.MaxValue;
if(!string.IsNullOrEmpty(filter.Name))
infoMaterials = infoMaterials.Where(im => im.Name.Contains(filter.Name)).Take(filter.NumberOfRows);
if(filter.ByRating)
{
if(filter.SortDirection == SortDirectionType.Top)
infoMaterials = infoMaterials.OrderByDescending(im => im.Rating).Take(filter.NumberOfRows);
else
infoMaterials = infoMaterials.OrderBy(im => im.Rating).Take(filter.NumberOfRows);
}
if(filter.ByViewCount)
if(filter.SortDirection == SortDirectionType.Top)
infoMaterials = infoMaterials.OrderByDescending(im => im.ViewCount).Take(filter.NumberOfRows);
else
infoMaterials = infoMaterials.OrderBy(im => im.ViewCount).Take(filter.NumberOfRows);
Всеостальныеоперации, помимоselect, обеспечиваютсязасчетORM, свойстваDataSource элементауправленияGridControl итехнологииDataBindings, реализованнойвWPF (Windows Presentation Foundation).
5. Листинг программы
App.xaml
Applicationx:Class=«WpfRDB.App»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»xmlns:Core=«clr-namespace:DevExpress.Wpf.Core;assembly=DevExpress.Wpf.Core.v9.3»StartupUri=«CategoriesWindow.xaml»>
Application.Resources>
ResourceDictionary>
DataTemplatex:Key=«DetailCoreTemplate»>
Core:MeasurePixelSnapper>
Grid>
Grid.RowDefinitions>
RowDefinitionHeight=«4» />
RowDefinitionHeight=«Auto» />
RowDefinitionHeight=«4» />
Grid.RowDefinitions>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«4» />
ColumnDefinitionWidth=«Auto»/>
ColumnDefinitionWidth=«12»/>
ColumnDefinition/>
Grid.ColumnDefinitions>
BorderGrid.Column=«1»Grid.Row=«1»BorderBrush=«Black»BorderThickness=«1»>
ImageSource=”{BindingDataContext.BitmapSource}”Height=«128»Width=«128»Name=«imgInfoMat»Stretch=«Fill»HorizontalAlignment=«Left»VerticalAlignment=«Top»/>
Border>
GridGrid.Column=«3»Grid.Row=«1»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«Auto»MinWidth=«125» />
ColumnDefinitionWidth=«12»/>
ColumnDefinition/>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«26»/>
RowDefinitionHeight=«42»/>
RowDefinitionHeight=«20»/>
RowDefinitionHeight=«20»/>
RowDefinitionHeight=«20» />
Grid.RowDefinitions>
TextBlockGrid.Column=«0»Grid.Row=«0»Text=”Название:”/>
TextBlockGrid.Column=«0»Grid.Row=«1»Text=”Описание:”/>
TextBlockGrid.Column=«0»Grid.Row=«2»Text=”Датапубликации:”/>
TextBlockGrid.Column=«0»Grid.Row=«3»Text=”Количествопросмотров:”/>
TextBlockGrid.Column=«0»Grid.Row=«4»Text=”Рейтинг:”/>
TextBlockGrid.Column=«2»Grid.Row=«0»Text=”{BindingDataContext.Name}”/>
TextBlockGrid.Column=«2»Grid.Row=«1»Text=”{BindingDataContext.Annotation}”TextWrapping=«WrapWithOverflow»/>
TextBlockGrid.Column=«2»Grid.Row=«2»Text=”{BindingDataContext.PublishDate,Converter={Core:FormatStringConverterD}}”/>
TextBlockGrid.Column=«2»Grid.Row=«3»Text=”{BindingDataContext.ViewCount}”/>
TextBlockGrid.Column=«2»Grid.Row=«4»Text=”{BindingDataContext.Rating}”/>
Grid>
Grid>
Core:MeasurePixelSnapper>
DataTemplate>
ResourceDictionary>
Application.Resources>
Application>
продолжение
–PAGE_BREAK–CategoriesWindow.xaml
Windowx:Class=«WpfRDB.CategoriesWindow»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»
xmlns:dxg=«schemas.devexpress.com/winfx/2008/xaml/grid»
xmlns:dx=«schemas.devexpress.com/winfx/2008/xaml/core»
xmlns:dxe=«schemas.devexpress.com/winfx/2008/xaml/editors»
Title=”Категорииинформационныхматериалов”Height=«592»Width=«800»Loaded=«Window_Loaded»MinHeight=«592»
Icon=«Images/yinyang.png»Closing=«Window_Closing»>
GridMargin=«0,0,0,0»dx:ThemeManager.ThemeName=«Office2007Blue»>
Grid.RowDefinitions>
RowDefinitionHeight=«402*» />
RowDefinitionHeight=«165*» />
Grid.RowDefinitions>
dxg:GridControlName=«grdCategories»Margin=«2,2,2,2»>
dxg:GridControl.Columns>
dxg:GridColumnFieldName=«Name»>Категорияdxg:GridColumn>
dxg:GridColumnFieldName=«BitmapSource»AllowColumnFiltering=«False»>
dxg:GridColumn.CellTemplate>
DataTemplate>
ImageSource=”{BindingPath=Value}”HorizontalAlignment=«Left»Margin=«8,3,0,3»Stretch=«Fill» />
DataTemplate>
dxg:GridColumn.CellTemplate>
dxg:GridColumn>
dxg:GridColumnFieldName=«Description»MinWidth=«100»EditSettings=”{dxe:MemoSettingsShowIcon=False,PopupWidth=500,PopupHeight=300,MemoTextWrapping=Wrap,MemoVerticalScrollBarVisibility=Auto}”>Описаниеdxg:GridColumn>
dxg:GridControl.Columns>
dxg:GridControl.View>
dxg:CardViewShowGroupPanel=«False»IsColumnChooserVisible=«False»AllowEditing=«False»ShowGroupedColumns=«True»CardAlignment=«Center»CardLayout=«Columns»MaxCardCountInRow=«1»NavigationStyle=«Cell»FixedSize=«250»MinFixedSize=«150»Name=«view»CardHeaderDisplayMemberBinding=”{BindingPath=Data.Name,RelativeSource={RelativeSourceSelf}}”MouseDoubleClick=«view_MouseDoubleClick»FocusedRowChanged=«view_FocusedRowChanged» />
dxg:GridControl.View>
dxg:GridControl>
GroupBoxGrid.Row=«1»x:Name=«panel»DataContext=”{BindingPath=View.FocusedRowData,ElementName=grdCategories}”Margin=«0,0,0,1»Height=«153.674»VerticalAlignment=«Bottom»>
Grid>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«128»>ColumnDefinition>
ColumnDefinitionWidth=”*”>ColumnDefinition>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«128»>RowDefinition>
Grid.RowDefinitions>
BorderBorderThickness=«1»BorderBrush=«Black»Height=«128»Width=«128»>
ImageSource=”{BindingDataContext.BitmapSource}”Name=«imgCategory»Stretch=«Fill»HorizontalAlignment=«Left»VerticalAlignment=«Top»Grid.Column=«0»/>
Border>
ButtonName=«btnLoadImage»Margin=«0,0,1,1»Height=«22»Width=«22»HorizontalAlignment=«Right»VerticalAlignment=«Bottom»Click=«btnLoadImage_Click»>
ImageToolTip=”Выбратьизображение”>
Image.Source>pack://application:,,,/Images/folder_out.pngImage.Source>
Image>
Button>
GridGrid.Column=«1»Margin=«16,0,0,0»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«Auto»MinWidth=«56» />
ColumnDefinitionWidth=«6»/>
ColumnDefinition/>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«Auto»/>
RowDefinitionHeight=«4»/>
RowDefinitionHeight=«18» />
RowDefinitionHeight=«4»/>
RowDefinitionHeight=«Auto»/>
RowDefinitionHeight=«4»/>
RowDefinitionHeight=«60» />
RowDefinitionHeight=«4»/>
RowDefinitionHeight=”*”/>
Grid.RowDefinitions>
TextBlockGrid.Column=«0»Grid.Row=«2»Text=”Категория:”/>
TextBlockGrid.Column=«0»Grid.Row=«6»Text=”Описание:”/>
dxe:TextEditName=«txtCategoryName»Grid.Column=«2»Grid.Row=«2»Text=”{BindingDataContext.Name}”EditValueChanged=«TextBox_EditValueChanged»GotFocus=«TextBox_GotFocus» />
dxe:TextEditName=«txtDescription»Grid.Column=«2»Grid.Row=«6»VerticalContentAlignment=«Top»VerticalScrollBarVisibility=«Auto»Text=”{BindingDataContext.Description}”TextWrapping=«WrapWithOverflow»EditValueChanged=«TextBox_EditValueChanged»GotFocus=«TextBox_GotFocus»/>
TextBlockGrid.Column=«2»Grid.Row=«8»VerticalAlignment=«Bottom»HorizontalAlignment=«Right»Height=«13.277»Width=«231»Text=”© TSSoft. IMat, 2010. Всеправазащищены.”Foreground=«DarkGray» />
Grid>
Grid>
GroupBox>
ButtonHeight=«22»Width=«22»HorizontalAlignment=«Right»Margin=«0,5,42,0»Name=«btnPrev»VerticalAlignment=«Top»Click=«btnPrev_Click»>
ImageToolTip=”Назад”>
Image.Source>pack://application:,,,/Images/nav_left_blue.pngImage.Source>
Image>
Button>
ButtonWidth=«22»Height=«22»HorizontalAlignment=«Right»Margin=«0,5,130,0»Name=«btnNew»Click=«btnNew_Click»VerticalAlignment=«Top»>
ImageToolTip=”Добавитькатегорию”>
Image.Source>pack://application:,,,/Images/window_add.pngImage.Source>
Image>
Button>
ButtonWidth=«22»Height=«22»HorizontalAlignment=«Right»Margin=«0,5,161,0»Name=«btnDelete»Click=«btnDelete_Click»VerticalAlignment=«Top»>
ImageToolTip=”Удалитькатегорию”>
Image.Source>pack://application:,,,/Images/window_delete.pngImage.Source>
Image>
Button>
ButtonWidth=«22»Height=«22»HorizontalAlignment=«Right»Name=«btnSave»Click=«btnSave_Click»Margin=«0,5,85,0»VerticalAlignment=«Top»>
ImageToolTip=”Сохранить”>
Image.Source>pack://application:,,,/Images/disk_blue.pngImage.Source>
Image>
Button>
TextBlockHeight=«18»Margin=«10,9,383,0»VerticalAlignment=«Top»Text=”Переходвподкатегориюосуществляетсядвойнымщелчкомпокатегории”Foreground=«RoyalBlue» />
Grid>
Window>
продолжение
–PAGE_BREAK–CategoriesWindow.xaml.cs
usingSystem.Collections.Generic;
usingSystem.IO;
usingSystem.Windows;
usingSystem.Windows.Forms;
usingSystem.Windows.Media.Imaging;
usingASDC.Model.InfoMaterials;
usingMessageBox=System.Windows.Forms.MessageBox;
namespaceWpfRDB
{
///
///Interaction logic for Window1.xaml
///
publicpartialclassCategoriesWindow
{
privateInfoMaterialsDataManager_dataManager;
privateobject_prevDataSource;
privateCategory_currentParentCategory;
privatebool_needForSave;
privatebool_focusedRowChanged;
publicCategoriesWindow()
{
InitializeComponent();
_dataManager = newInfoMaterialsDataManager();
}
privatevoidInitCategoriesGrid()
{
grdCategories.DataSource = _dataManager.CategoryRepository.GetCategories();
grdCategories.RefreshData();
}
privatevoidWindow_Loaded(objectsender, RoutedEventArgse)
{
InitCategoriesGrid();
}
privatevoidbtnNew_Click(objectsender, RoutedEventArgse)
{
grdCategories.BeginDataUpdate();
varc = newCategory{ParentCategory = _currentParentCategory != null? _currentParentCategory.ID_Category: 0,
Parent = _currentParentCategory};
((ListCategory>)grdCategories.DataSource).Add(c);
_dataManager.CategoryRepository.InsertCategory(c);
_needForSave = true;
grdCategories.EndDataUpdate();
grdCategories.View.MoveLastRow();
}
privatevoidbtnLoadImage_Click(objectsender, RoutedEventArgse)
{
vardlg = newOpenFileDialog();
dlg.Filter = «Image files: *.jpg, *.png, *.bmp | *.jpg; *.png; *.bmp»;
if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
System.Drawing.Imageimg = System.Drawing.Image.FromFile(dlg.FileName);
BitmapImagebitmap = newBitmapImage();
bitmap.BeginInit();
MemoryStreamms = newMemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
bitmap.StreamSource = ms;
bitmap.EndInit();
varc = (Category) grdCategories.GetFocusedRow();
c.BitmapSource = bitmap;
grdCategories.RefreshData();
_needForSave = true;
}
}
privatevoidbtnSave_Click(objectsender, RoutedEventArgse)
{
Save();
}
privatevoidbtnDelete_Click(objectsender, RoutedEventArgse)
{
if(grdCategories.View.SelectedRows.Count > 0)
{
if (MessageBox.Show(«Вы действительно хотите удалить выбранную категорию?», «Сообщение»,
MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
{
grdCategories.BeginDataUpdate();
varc = (Category) grdCategories.GetFocusedRow();
_dataManager.CategoryRepository.DeleteCategory(c);
((ListCategory>) (grdCategories.DataSource)).Remove(c);
_needForSave = true;
grdCategories.EndDataUpdate();
}
}
}
privatevoidview_MouseDoubleClick(objectsender, System.Windows.Input.MouseButtonEventArgse)
{
introwHandle = grdCategories.View.GetRowHandleByMouseEventArgs(e);
if(grdCategories.IsValidRowHandle(rowHandle))
{
if(AskForSave())
Save();
varc = (Category) grdCategories.GetFocusedRow();
if(c.Children != null)
{
_currentParentCategory = c;
_prevDataSource = grdCategories.DataSource;
grdCategories.DataSource = c.Children;
grdCategories.RefreshData();
}
else
{
varinfoMaterialsWindow = newInfoMaterialsWindow(_dataManager, c);
infoMaterialsWindow.Show();
}
}
}
privatevoidSave()
{
if(_needForSave)
{
_dataManager.CategoryRepository.SaveChanges();
_needForSave = false;
}
}
privateboolAskForSave()
{
if(_needForSave)
{
if(MessageBox.Show(“Сохранитьсделанныеизменения?”,”Сообщение”, MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
{
returntrue;
}
}
returnfalse;
}
privatevoidbtnPrev_Click(objectsender, RoutedEventArgse)
{
if(_prevDataSource != null)
grdCategories.DataSource = _prevDataSource;
}
privatevoidview_FocusedRowChanged(objectsender, DevExpress.Wpf.Grid.FocusedRowChangedEventArgse)
{
_focusedRowChanged = true;
}
privatevoidTextBox_EditValueChanged(objectsender, DevExpress.Wpf.Editors.EditValueChangedEventArgse)
{
if(!_focusedRowChanged)
_needForSave = true;
}
privatevoidWindow_Closing(objectsender, System.ComponentModel.CancelEventArgse)
{
if(AskForSave())
Save();
}
privatevoidTextBox_GotFocus(objectsender, RoutedEventArgse)
{
_focusedRowChanged = false;
}
}
}
продолжение
–PAGE_BREAK–InfoMaterialAddEditWindow.xaml
Windowx:Class=«WpfRDB.InfoMaterialAddEditWindow»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»
xmlns:dxe=«clr-namespace:DevExpress.Wpf.Editors;assembly=DevExpress.Wpf.Editors.v9.3»
xmlns:dx=«clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3»
Title=«InfoMaterial»Height=«692»Width=«721»Loaded=«Window_Loaded»Icon=«Images/yinyang.png»>
Griddx:ThemeManager.ThemeName=«Office2007Blue»x:Name=«grBase»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«4» />
ColumnDefinition/>
ColumnDefinitionWidth=«4»/>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«24» />
RowDefinitionHeight=«7» />
RowDefinitionHeight=«128» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«16» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«445*» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«28» />
RowDefinitionHeight=«4» />
Grid.RowDefinitions>
TextBlockGrid.Column=«1»HorizontalAlignment=«Left»Width=«64»Text=”Заголовок:”Margin=«0,3» />
dxe:TextEditGrid.Column=«1»Margin=«0,0,3,2»Name=«txtHeader»Text=”{BindingName}”FontSize=«14»FontWeight=«Bold»HorizontalAlignment=«Right»Width=«629»Grid.ColumnSpan=«2» />
BorderGrid.Column=«1»Grid.Row=«1»VerticalAlignment=«Top»Height=«1»BorderThickness=«1»BorderBrush=«Black»>Border>
GridGrid.Row=«2»Grid.Column=«1»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«128»/>
ColumnDefinitionWidth=«4»/>
ColumnDefinitionWidth=«200*»/>
Grid.ColumnDefinitions>
BorderGrid.Column=«0»BorderThickness=«1»BorderBrush=«Black»>
ImageWidth=«128»HorizontalAlignment=«Left»Name=«imgPicture»Stretch=«Fill»Source=”{BindingBitmapSource}” />
Border>
ButtonHeight=«22»Width=«22»HorizontalAlignment=«Right»Margin=«0,0,1,1»Name=«btnLoadImage»VerticalAlignment=«Bottom»Click=«btnLoadImage_Click»>
ImageToolTip=”Выбратьизображение”>
Image.Source>pack://application:,,,/Images/folder_out.pngImage.Source>
Image>
Button>
TextBlockGrid.Column=«2»Height=«19»HorizontalAlignment=«Left»VerticalAlignment=«Top»Width=«120»Text=”Аннотация:” />
dxe:TextEditGrid.Column=«2»Name=«txtAnnotation»TextWrapping=«WrapWithOverflow»VerticalContentAlignment=«Top»Text=”{BindingAnnotation}”Margin=«0,20,0,0» />
Grid>
TextBlockGrid.Row=«4»Grid.Column=«1»HorizontalAlignment=«Left»VerticalAlignment=«Bottom»Width=«132»Text=”Текст:” />
dxe:TextEditGrid.Row=«6»Grid.Column=«1»Name=«txtText»TextWrapping=«WrapWithOverflow»VerticalContentAlignment=«Top»Text=”{BindingText}” />
ButtonGrid.Row=«8»Grid.Column=«1»HorizontalAlignment=«Right»Name=«btnOK»Width=«75»Click=«btnOK_Click»>OKButton>
Grid>
Window>
продолжение
–PAGE_BREAK–InfoMaterialAddEditWindow.xaml.cs
usingSystem.IO;
usingSystem.Windows;
usingSystem.Windows.Forms;
usingSystem.Windows.Media.Imaging;
usingASDC.Model.InfoMaterials;
namespaceWpfRDB
{
///
///Interaction logic for InfoMaterialAddWindow.xaml
///
publicpartialclassInfoMaterialAddEditWindow
{
privateInfoMaterial_infoMaterial;
publicInfoMaterialAddEditWindow()
{
InitializeComponent();
}
publicInfoMaterialAddEditWindow(InfoMaterialinfoMaterial): this()
{
_infoMaterial = infoMaterial;
}
privatevoidInitDataSources()
{
grBase.DataContext = _infoMaterial;
}
privatevoidRefreshDataSource()
{
grBase.DataContext = null;
grBase.DataContext = _infoMaterial;
}
privatevoidWindow_Loaded(objectsender, RoutedEventArgse)
{
InitDataSources();
}
privatevoidbtnOK_Click(objectsender, RoutedEventArgse)
{
DialogResult = true;
Close();
}
privatevoidbtnLoadImage_Click(objectsender, RoutedEventArgse)
{
vardlg = newOpenFileDialog();
dlg.Filter = «Image files: *.jpg, *.png, *.bmp | *.jpg; *.png; *.bmp»;
if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
System.Drawing.Imageimg = System.Drawing.Image.FromFile(dlg.FileName);
BitmapImagebitmap = newBitmapImage();
bitmap.BeginInit();
MemoryStreamms = newMemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
bitmap.StreamSource = ms;
bitmap.EndInit();
if(_infoMaterial.Image == null)
_infoMaterial.Image = newInfoMat_Image();
_infoMaterial.BitmapSource = bitmap;
RefreshDataSource();
}
}
}
}
InfoMaterialsFilterWindow.xaml
Windowx:Class=«WpfRDB.InfoMaterialsFilterWindow»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»
xmlns:dxe=«schemas.devexpress.com/winfx/2008/xaml/editors»
Title=”Фильтрацияинформационныхматериалов”Icon=«Images/yinyang.png»Height=«588»Width=«639»xmlns:dxg=«schemas.devexpress.com/winfx/2008/xaml/grid»xmlns:dx=«clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3»>
Griddx:ThemeManager.ThemeName=«Office2007Blue»>
Grid.RowDefinitions>
RowDefinitionHeight=«120» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«285*» />
Grid.RowDefinitions>
Grid>
Grid.RowDefinitions>
RowDefinitionHeight=«4» />
RowDefinitionHeight=«18» />
RowDefinitionHeight=«8» />
RowDefinitionHeight=«18» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«18» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«18» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«18» />
Grid.RowDefinitions>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«7» />
ColumnDefinitionWidth=«120» />
ColumnDefinitionWidth=«10» />
ColumnDefinitionWidth=«140» />
ColumnDefinitionWidth=«40» />
ColumnDefinitionWidth=«120» />
ColumnDefinitionWidth=«10» />
ColumnDefinitionWidth=«140» />
ColumnDefinitionWidth=«7*» />
Grid.ColumnDefinitions>
ImageGrid.Column=«1»Grid.ColumnSpan=«1»Grid.Row=«1»Grid.RowSpan=«1»Width=«16»Height=«16»VerticalAlignment=«Center»HorizontalAlignment=«Left»Stretch=«Fill»>
Image.Source>pack://application:,,,/Images/funnel_preferences.pngImage.Source>
Image>
TextBlockGrid.Column=«1»Grid.ColumnSpan=«5»Grid.Row=«1»Text=”Параметрыфильтрацииинформационныхматериалов”Margin=«22,0,0,0»VerticalAlignment=«Center» />
BorderGrid.Column=«0»Grid.ColumnSpan=«7»Grid.Row=«2»VerticalAlignment=«Center»Height=«0.5»BorderThickness=«0.5»BorderBrush=«Navy»>Border>
TextBlockGrid.Column=«1»Grid.ColumnSpan=«1»Grid.Row=«3»Grid.RowSpan=«1»Text=”Название:”/>
dxe:TextEditGrid.Column=«3»Grid.Row=«3»Grid.RowSpan=«1»Name=«txtName» />
dxe:CheckEditGrid.Column=«1»Grid.Row=«5»Name=«chkRating»Content=”Рейтинг”IsChecked=«True»Checked=«RatingAndViewCount_Checked»Unchecked=«RatingAndViewCount_Unchecked» />
dxe:CheckEditGrid.Column=«3»Grid.Row=«5»Name=«chkViewCount»Content=”Популярность”ToolTip=”Количествопросмотров”Checked=«RatingAndViewCount_Checked»Unchecked=«RatingAndViewCount_Unchecked» />
TextBlockGrid.Column=«1»Grid.ColumnSpan=«1»Grid.Row=«7»Grid.RowSpan=«1»Text=”Количество:” />
dxe:SpinEditGrid.Column=«3»Grid.Row=«7»Grid.RowSpan=«1»Name=«speNumberOfRows»IsFloatValue=«False» />
TextBlockGrid.Column=«5»Grid.ColumnSpan=«1»Grid.Row=«3»Grid.RowSpan=«1»Text=”Датапубликации”/>
TextBlockGrid.Column=«5»Grid.ColumnSpan=«1»Grid.Row=«5»Grid.RowSpan=«1»Text=”с:”/>
dxe:DateEditGrid.Column=«7»Grid.Row=«5»Grid.RowSpan=«1»Name=«dteDateFrom»/>
TextBlockGrid.Column=«5»Grid.ColumnSpan=«1»Grid.Row=«7»Grid.RowSpan=«1»Text=”по:”/>
dxe:DateEditGrid.Column=«7»Grid.Row=«7»Grid.RowSpan=«1»Name=«dteDateTo»/>
TextBlockGrid.Column=«1»Grid.ColumnSpan=«1»Grid.Row=«9»Grid.RowSpan=«1»Text=”Направление:”/>
dxe:CheckEditGrid.Column=«3»Grid.Row=«9»ToolTip=”Лучшие”Name=«chkTop»IsChecked=«True»Checked=«TopAndLow_Checked»HorizontalAlignment=«Left»Width=«40»Unchecked=«TopAndLow_Unchecked»>
Image>
Image.Source>pack://application:,,,/Images/nav_up_green.pngImage.Source>
Image>
dxe:CheckEdit>
dxe:CheckEditGrid.Column=«3»Grid.Row=«9»Width=«40»HorizontalAlignment=«Left»ToolTip=”Худшие”Name=«chkLow»Margin=«44,0,0,0»Checked=«TopAndLow_Checked»Unchecked=«TopAndLow_Unchecked»>
Image>
Image.Source>pack://application:,,,/Images/nav_down_red.pngImage.Source>
Image>
dxe:CheckEdit>
ButtonGrid.Column=«7»Grid.Row=«9»Name=«btnFilter»Margin=«32,0,0,0»Click=«btnFilter_Click»>ФильтроватьButton>
Grid>
BorderGrid.Row=«1»VerticalAlignment=«Center»Height=«0.5»BorderThickness=«0.5»BorderBrush=«Navy»>Border>
dxg:GridControlGrid.Row=«2»Name=«grdInfoMaterials»>
dxg:GridControl.Columns>
dxg:GridColumnFieldName=«Name»>Названиеdxg:GridColumn>
dxg:GridColumnFieldName=«Annotation»>Описаниеdxg:GridColumn>
dxg:GridColumnFieldName=«ViewCount»>Количествопросмотровdxg:GridColumn>
dxg:GridColumnFieldName=«Rating»>Рейтингdxg:GridColumn>
dxg:GridColumnFieldName=«PublishDate»>Датапубликацииdxg:GridColumn>
dxg:GridControl.Columns>
dxg:GridControl.View>
dxg:TableView
Name=«view»ShowGroupPanel=«False»ShowColumnHeaders=«False»NavigationStyle=«Row»DataRowTemplate=”{DynamicResourceDetailCoreTemplate}”AutoWidth=«True»MouseDoubleClick=«view_MouseDoubleClick»>
dxg:TableView>
dxg:GridControl.View>
dxg:GridControl>
Grid>
Window>
продолжение
–PAGE_BREAK–InfoMaterialsFilterWindow.xaml.cs
usingSystem;
usingSystem.Collections.Generic;
usingASDC.Model.Classes;
usingASDC.Model.InfoMaterials;
usingDevExpress.Wpf.Editors;
namespaceWpfRDB
{
///
///ЛогикадляInfoMaterialsFilterWindow.xaml
///
publicpartialclassInfoMaterialsFilterWindow
{
privateInfoMaterialsDataManager_dataManager;
privateCheckEdit_curRatingOrViewCount;
privateCheckEdit_curTopOrLow;
publicInfoMaterialsFilterWindow()
{
InitializeComponent();
_curRatingOrViewCount = chkRating;
_curTopOrLow = chkTop;
}
publicInfoMaterialsFilterWindow(InfoMaterialsDataManagerdataManager): this()
{
_dataManager = dataManager;
}
privatevoidview_MouseDoubleClick(objectsender, System.Windows.Input.MouseButtonEventArgse)
{
introwHandle = grdInfoMaterials.View.GetRowHandleByMouseEventArgs(e);
if(grdInfoMaterials.IsValidRowHandle(rowHandle))
{
varinfoMaterial = (InfoMaterial) grdInfoMaterials.GetRow(rowHandle);
infoMaterial = _dataManager.InfoMaterialRepository.GetInfoMaterial(infoMaterial.ID_InfoMaterial);
((ListInfoMaterial>) grdInfoMaterials.DataSource)[grdInfoMaterials.GetRowListIndex(rowHandle)] =
infoMaterial;
ViewMaterial(infoMaterial);
}
}
privatevoidbtnFilter_Click(objectsender, System.Windows.RoutedEventArgse)
{
varfilter = newFilter();
filter.Name = txtName.Text;
filter.ByRating = chkRating.IsChecked != null? (bool) chkRating.IsChecked: false;
filter.ByViewCount = chkViewCount.IsChecked != null? (bool) chkViewCount.IsChecked: false;
filter.NumberOfRows = (int) speNumberOfRows.Value;
filter.DateFrom = dteDateFrom.EditValue != null? dteDateFrom.DateTime: newDateTime(1900,01,01);
filter.DateTo = dteDateTo.EditValue != null? dteDateTo.DateTime: DateTime.Now;
filter.SortDirection = chkTop.IsChecked == true? SortDirectionType.Top: SortDirectionType.Low;
grdInfoMaterials.BeginDataUpdate();
grdInfoMaterials.DataSource = _dataManager.InfoMaterialRepository.GetInfoMaterialsByFilter(filter);
grdInfoMaterials.EndDataUpdate();
}
privatevoidRatingAndViewCount_Checked(objectsender, System.Windows.RoutedEventArgse)
{
_curRatingOrViewCount = (CheckEdit) sender;
if(sender.Equals(chkRating))
chkViewCount.IsChecked = false;
else
chkRating.IsChecked = false;
}
privatevoidTopAndLow_Checked(objectsender, System.Windows.RoutedEventArgse)
{
_curTopOrLow = (CheckEdit) sender;
if(sender.Equals(chkTop))
chkLow.IsChecked = false;
else
chkTop.IsChecked = false;
}
privatevoidRatingAndViewCount_Unchecked(objectsender, System.Windows.RoutedEventArgse)
{
varchk = (CheckEdit)sender;
if(chk.Equals(_curRatingOrViewCount))
chk.IsChecked = true;
}
privatevoidTopAndLow_Unchecked(objectsender, System.Windows.RoutedEventArgse)
{
varchk = (CheckEdit)sender;
if(chk.Equals(_curTopOrLow))
chk.IsChecked = true;
}
privatevoidViewMaterial(InfoMaterialinfoMaterial)
{
varimWindow = newInfoMaterialWindow(infoMaterial);
imWindow.ShowDialog();
Save();
}
privatevoidSave()
{
_dataManager.InfoMaterialRepository.SaveChanges();
}
}
}
продолжение
–PAGE_BREAK–InfoMaterialsWindow.xaml
Windowx:Class=«WpfRDB.InfoMaterialsWindow»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»
xmlns:dx=«clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3»Title=”Информационныематериалы”Height=«494»Width=«758»Loaded=«Window_Loaded»
Icon=«Images/yinyang.png»>
Griddx:ThemeManager.ThemeName=«Office2007Blue»>
Grid.RowDefinitions>
RowDefinitionHeight=«24» />
RowDefinitionHeight=«2» />
RowDefinitionHeight=«369*» />
Grid.RowDefinitions>
ImageWidth=«16»HorizontalAlignment=«Left»Margin=«4,4,0,4»Name=«image1»Stretch=«Fill»>
Image.Source>pack://application:,,,/Images/information.pngImage.Source>
Image>
TextBlockHorizontalAlignment=«Left»Margin=«26,4,0,4»Name=«tbHeader»Text=”Информационныематериалы”Width=«160» />
dxg:GridControlGrid.Row=«2»Name=«grdInfoMaterials»xmlns:dxg=«schemas.devexpress.com/winfx/2008/xaml/grid»>
dxg:GridControl.Columns>
dxg:GridColumnFieldName=«Name»>Названиеdxg:GridColumn>
dxg:GridColumnFieldName=«Annotation»>Описаниеdxg:GridColumn>
dxg:GridColumnFieldName=«ViewCount»>Количествопросмотровdxg:GridColumn>
dxg:GridColumnFieldName=«Rating»>Рейтингdxg:GridColumn>
dxg:GridColumnFieldName=«PublishDate»>Датапубликацииdxg:GridColumn>
dxg:GridControl.Columns>
dxg:GridControl.View>
dxg:TableView
Name=«view»ShowGroupPanel=«False»ShowColumnHeaders=«False»NavigationStyle=«Row»DataRowTemplate=”{DynamicResourceDetailCoreTemplate}”AutoWidth=«True»MouseDoubleClick=«view_MouseDoubleClick»>
dxg:TableView>
dxg:GridControl.View>
dxg:GridControl>
ButtonHorizontalAlignment=«Right»Margin=«0,2,8,0»Name=«btnAdd»Width=«22»Height=«22»Click=«btnAdd_Click»>
Image.Source>pack://application:,,,/Images/window_add.pngImage.Source>
Image>
Button>
ButtonHorizontalAlignment=«Right»Margin=«0,2,37,0»Name=«btnEdit»Width=«22»Click=«btnEdit_Click»>
Image.Source>pack://application:,,,/Images/window_edit.pngImage.Source>
Image>
Button>
ButtonHorizontalAlignment=«Right»Margin=«0,2,66,0»Name=«btnDelete»Width=«22»Click=«btnDelete_Click»>
Image.Source>pack://application:,,,/Images/window_delete.pngImage.Source>
Image>
Button>
ButtonHorizontalAlignment=«Right»Margin=«0,2,95,0»Name=«btnView»Width=«22»Click=«btnView_Click»>
Image.Source>pack://application:,,,/Images/window_view.pngImage.Source>
Image>
Button>
Grid>
Window>
продолжение
–PAGE_BREAK–InfoMaterialsWindow.xaml.cs
usingSystem.Collections.Generic;
usingSystem.Windows.Forms;
usingSystem.Windows.Input;
usingASDC.Model.InfoMaterials;
usingInfoMaterial=ASDC.Model.InfoMaterials.InfoMaterial;
namespaceWpfRDB
{
///
///Interaction logic for InfoMaterialWindow.xaml
///
publicpartialclassInfoMaterialsWindow
{
// TODO: Написать Convertor для Image.Source, который будет переводить байты в BitmapSource и подвязать его на Binding
privateInfoMaterialsDataManager_dataManager;
privateCategory_category;
publicInfoMaterialsWindow()
{
InitializeComponent();
}
publicInfoMaterialsWindow(InfoMaterialsDataManagerdataManager, Categorycategory): this()
{
_dataManager = dataManager;
_category = category;
}
publicvoidInitGrid()
{
grdInfoMaterials.DataSource = _dataManager.InfoMaterialRepository.GetShortInfoMaterialsByCategory(_category.ID_Category);
grdInfoMaterials.RefreshData();
}
privatevoidWindow_Loaded(objectsender, System.Windows.RoutedEventArgse)
{
if(_dataManager == null)
_dataManager = newInfoMaterialsDataManager();
InitGrid();
}
privatevoidview_MouseDoubleClick(objectsender, MouseButtonEventArgse)
{
introwHandle = grdInfoMaterials.View.GetRowHandleByMouseEventArgs(e) ;
if(grdInfoMaterials.IsValidRowHandle(rowHandle))
{
ViewMaterial((InfoMaterial) grdInfoMaterials.GetRow(rowHandle));
}
}
privatevoidbtnAdd_Click(objectsender, System.Windows.RoutedEventArgse)
{
varnewInfoMaterial = newInfoMaterial{Category = _category};
varimAddEditWindow = newInfoMaterialAddEditWindow(newInfoMaterial);
imAddEditWindow.Title = «Добавление информационного материала»;
if(imAddEditWindow.ShowDialog() == true)
{
grdInfoMaterials.BeginDataUpdate();
((ListInfoMaterial>) grdInfoMaterials.DataSource).Add(newInfoMaterial);
grdInfoMaterials.EndDataUpdate();
_dataManager.InfoMaterialRepository.InsertInfoMaterial(newInfoMaterial);
Save();
}
}
privatevoidSave()
{
_dataManager.InfoMaterialRepository.SaveChanges();
}
privatevoidbtnEdit_Click(objectsender, System.Windows.RoutedEventArgse)
{
if(grdInfoMaterials.View.SelectedRows.Count > 0)
{
grdInfoMaterials.BeginDataUpdate();
varimAddEditWindow = newInfoMaterialAddEditWindow(((InfoMaterial)grdInfoMaterials.GetFocusedRow()));
imAddEditWindow.Title = «Редактирование информационного материала»;
imAddEditWindow.ShowDialog();
grdInfoMaterials.EndDataUpdate();
Save();
}
}
privatevoidbtnDelete_Click(objectsender, System.Windows.RoutedEventArgse)
{
if(grdInfoMaterials.View.SelectedRows.Count > 0)
{
if (MessageBox.Show(«Вы действительно хотите удалить выбранный материал?», «Сообщение»,
MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
{
grdInfoMaterials.BeginDataUpdate();
varinfoMaterial = (InfoMaterial) grdInfoMaterials.GetFocusedRow();
_dataManager.InfoMaterialRepository.DeleteInfoMaterial(infoMaterial);
((ListInfoMaterial>)(grdInfoMaterials.DataSource)).Remove(infoMaterial);
grdInfoMaterials.EndDataUpdate();
Save();
}
}
}
privatevoidbtnView_Click(objectsender, System.Windows.RoutedEventArgse)
{
if(grdInfoMaterials.View.SelectedRows.Count > 0)
{
ViewMaterial((InfoMaterial)grdInfoMaterials.GetFocusedRow());
}
}
privatevoidViewMaterial(InfoMaterialinfoMaterial)
{
varimWindow = newInfoMaterialWindow(infoMaterial);
imWindow.ShowDialog();
//_dataManager.InfoMaterialRepository.InsertComments(infoMaterial);
Save();
}
}
}
продолжение
–PAGE_BREAK–InfoMaterialWindow.xaml
Windowx:Class=«WpfRDB.InfoMaterialWindow»
xmlns=«schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«schemas.microsoft.com/winfx/2006/xaml»
xmlns:dx=«clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3»
xmlns:dxe=«schemas.devexpress.com/winfx/2008/xaml/editors»
xmlns:Core=«clr-namespace:DevExpress.Wpf.Core;assembly=DevExpress.Wpf.Core.v9.3»
Title=”Информационныйматериал”Height=«888»Width=«764»Loaded=«Window_Loaded»Icon=«Images/yinyang.png»>
Window.Resources>
ResourceDictionary>
DataTemplatex:Key=«DetailCoreTemplate»>
Core:MeasurePixelSnapper>
Grid>
Grid.RowDefinitions>
RowDefinitionHeight=«4» />
RowDefinitionHeight=«Auto» />
RowDefinitionHeight=«4» />
Grid.RowDefinitions>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«4» />
ColumnDefinitionWidth=«64»/>
ColumnDefinitionWidth=«12»/>
ColumnDefinitionWidth=«200*»/>
Grid.ColumnDefinitions>
BorderGrid.Column=«1»Grid.Row=«1»BorderBrush=«Black»BorderThickness=«1»>
ImageSource=”{BindingDataContext.BitmapSource}”Height=«64»Width=«64»Name=«imgInfoMat»Stretch=«Fill»HorizontalAlignment=«Left»VerticalAlignment=«Top»/>
Border>
GridGrid.Column=«3»Grid.Row=«1»>
Grid.RowDefinitions>
RowDefinitionHeight=«16»/>
RowDefinitionHeight=«2»/>
RowDefinition/>
Grid.RowDefinitions>
TextBlockGrid.Row=«0»Text=”{BindingDataContext.AddingDate,StringFormat=’hh:mmdd/MM/yyyy’}”FontSize=«10»Foreground=«DarkGray»HorizontalAlignment=«Left»Width=«159»/>
ButtonHorizontalAlignment=«Right»Name=«btnDelete»Width=«16»Height=«16»VerticalContentAlignment=«Center»Click=«btnDelete_Click»>
ImageToolTip=”Удалитькомментарий”>
Image.Source>pack://application:,,,/Images/cross.pngImage.Source>
Image>
Button>
TextBlockGrid.Row=«2»Text=”{BindingDataContext.Text}”TextWrapping=«WrapWithOverflow» />
Grid>
Grid>
Core:MeasurePixelSnapper>
DataTemplate>
ResourceDictionary>
Window.Resources>
Griddx:ThemeManager.ThemeName=«Office2007Blue»x:Name=«grBase»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«4» />
ColumnDefinition/>
ColumnDefinitionWidth=«4»/>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«24» />
RowDefinitionHeight=«7» />
RowDefinitionHeight=«128» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«250*» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«16» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«171*» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«140» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«28» />
RowDefinitionHeight=«4» />
Grid.RowDefinitions>
TextBlockGrid.Column=«1»Margin=«0,0,8,2»Name=«txtHeader»VerticalAlignment=«Bottom»Text=”{BindingName}”FontSize=«14»FontWeight=«Bold»TextDecorations=«None» />
BorderGrid.Column=«1»Grid.Row=«1»VerticalAlignment=«Top»Height=«1»BorderThickness=«1»BorderBrush=«Black»>Border>
GridGrid.Row=«2»Grid.Column=«1»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«128»/>
ColumnDefinitionWidth=«4»/>
ColumnDefinitionWidth=«200*»/>
Grid.ColumnDefinitions>
BorderGrid.Column=«0»BorderThickness=«1»BorderBrush=«Black»>
ImageWidth=«128»HorizontalAlignment=«Left»Name=«imgPicture»Stretch=«Fill»Source=”{BindingBitmapSource}” />
Border>
TextBlockGrid.Column=«2»Name=«txtAnnotation»TextWrapping=«Wrap»Text=”{BindingAnnotation}” />
Grid>
dxe:TextEditGrid.Row=«4»Grid.Column=«1»Name=«txtText»TextWrapping=«WrapWithOverflow»VerticalContentAlignment=«Top»Text=”{BindingText}” />
TextBlockGrid.Row=«6»Grid.Column=«1»Text=”Комментарии:” />
dxg:GridControlGrid.Row=«8»Grid.Column=«1»Name=«grdComments»xmlns:dxg=«schemas.devexpress.com/winfx/2008/xaml/grid»>
dxg:GridControl.Columns>
dxg:GridColumnFieldName=«Text» />
dxg:GridColumnFieldName=«AddingDate» />
dxg:GridControl.Columns>
dxg:GridControl.View>
dxg:TableView
Name=«view»ShowGroupPanel=«False»ShowColumnHeaders=«False»NavigationStyle=«Row»DataRowTemplate=”{DynamicResourceDetailCoreTemplate}”AutoWidth=«True»>
dxg:TableView>
dxg:GridControl.View>
dxg:GridControl>
GridGrid.Row=«10»Grid.Column=«1»x:Name=«grAddComment»>
Grid.ColumnDefinitions>
ColumnDefinitionWidth=«4»/>
ColumnDefinitionWidth=«200*»/>
ColumnDefinitionWidth=«4»/>
Grid.ColumnDefinitions>
Grid.RowDefinitions>
RowDefinitionHeight=«18» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«24» />
RowDefinitionHeight=«4» />
RowDefinitionHeight=«40*» />
Grid.RowDefinitions>
TextBlockGrid.Row=«0»Grid.Column=«1»Text=”Добавитьновыйкомментарий”FontSize=«11»FontWeight=«Bold» />
TextBlockGrid.Row=«2»Grid.Column=«1»Text=”Текст:”HorizontalAlignment=«Left»VerticalAlignment=«Center»Width=«89» />
ButtonGrid.Row=«2»Grid.Column=«1»Name=«btnAddComment»HorizontalAlignment=«Right»Width=«71»Click=«btnAddComment_Click»ToolTip=”Добавитьнаписанныйкомментарий”>ДобавитьButton>
dxe:TextEditGrid.Row=«4»Grid.Column=«1»Name=«txtComment»TextWrapping=«WrapWithOverflow»VerticalContentAlignment=«Top» />
Grid>
ButtonGrid.Row=«12»Grid.Column=«1»HorizontalAlignment=«Right»Name=«btnOK»Width=«71»Margin=«0,2»Grid.RowSpan=«2»Click=«btnOK_Click»>OKButton>
Grid>
Window>
продолжение
–PAGE_BREAK–InfoMaterialWindow.xaml.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Windows;
usingASDC.Model.InfoMaterials;
namespaceWpfRDB
{
///
///Interaction logic for InfoMaterial.xaml
///
publicpartialclassInfoMaterialWindow
{
privateInfoMaterial_infoMaterial;
publicInfoMaterialWindow()
{
InitializeComponent();
}
publicInfoMaterialWindow(InfoMaterialinfoMaterial): this()
{
_infoMaterial = infoMaterial;
}
privatevoidInitDataSources()
{
grBase.DataContext = _infoMaterial;
grdComments.DataSource = _infoMaterial.Comments;
grdComments.RefreshData();
}
privatevoidWindow_Loaded(objectsender, RoutedEventArgse)
{
InitDataSources();
}
privatevoidbtnAddComment_Click(objectsender, RoutedEventArgse)
{
varcomment = newComment{Text = txtComment.Text, AddingDate = DateTime.Now};
((ICollectionComment>) grdComments.DataSource).Add(comment);
_infoMaterial.Comments.Add(comment);
}
privatevoidbtnOK_Click(objectsender, RoutedEventArgse)
{
Close();
}
privatevoidbtnDelete_Click(objectsender, RoutedEventArgse)
{
grdComments.BeginDataUpdate();
varcomment = (Comment) grdComments.GetFocusedRow();
((ICollectionComment>) grdComments.DataSource).Remove(comment);
grdComments.EndDataUpdate();
}
}
}
Convertor.cs
usingSystem.Drawing;
usingSystem.IO;
usingSystem.Windows.Media.Imaging;
namespaceASDC.Model.Classes
{
publicstaticclassConvertor
{
publicstaticbyte[] ImageToByte(Imageimg)
{
varconverter = newImageConverter();
returnimg != null? (byte[])converter.ConvertTo(img, typeof(byte[])): null;
}
publicstaticImageByteToImage(byte[] bytes)
{
varconverter = newImageConverter();
returnbytes != null? (Image)converter.ConvertFrom(bytes): null;
}
publicstaticBitmapImageByteToBitmapSource(byte[] bytes)
{
varimg = ByteToImage(bytes);
returnImageToBitmapSource(img);
}
publicstaticBitmapImageImageToBitmapSource(Imageimg)
{
if(img == null)
returnnull;
varbi = newBitmapImage();
varms = newMemoryStream();
bi.BeginInit();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
returnbi;
}
publicstaticImageBitmapSourceToImage(BitmapImagebs)
{
if((bs == null) || (bs.StreamSource == null))
returnnull;
returnnewBitmap(bs.StreamSource);
}
publicstaticbyte[] BitmapSourceToBytes(BitmapImagebs)
{
varbitmap = (Bitmap)BitmapSourceToImage(bs);
returnImageToByte(bitmap);
}
}
}
продолжение
–PAGE_BREAK–Filter.cs
usingSystem;
namespaceASDC.Model.Classes
{
publicenumSortDirectionType
{
Top = 0,
Low = 1
}
publicclassFilter
{
privatestring_name;
privatebool_byRating;
privatebool_byViewCount;
privateint_numberOfRows;
privateDateTime_dateFrom;
privateDateTime_dateTo;
privateSortDirectionType_sortDirection;
publicstringName
{
get{ return_name; }
set{ _name = value; }
}
publicboolByRating
{
get{ return_byRating; }
set{ _byRating = value; }
}
publicboolByViewCount
{
get{ return_byViewCount; }
set{ _byViewCount = value; }
}
publicintNumberOfRows
{
get{ return_numberOfRows; }
set{ _numberOfRows = value; }
}
publicDateTimeDateFrom
{
get{ return_dateFrom; }
set{ _dateFrom = value; }
}
publicDateTimeDateTo
{
get{ return_dateTo; }
set{ _dateTo = value; }
}
publicSortDirectionTypeSortDirection
{
get{ return_sortDirection; }
set{ _sortDirection = value; }
}
}
}
Category.cs
usingSystem.Collections.Generic;
usingSystem.Drawing;
usingSystem.Windows.Media.Imaging;
usingASDC.Model.Classes;
namespaceASDC.Model.InfoMaterials
{
publicpartialclassCategory
{
publicCategoryParent { get; set; }
publicListCategory> Children { get; set; }
publicImageBitmap { get; set; }
privateBitmapImage_bitmapSource;
publicBitmapImageBitmapSource
{
get{ return_bitmapSource; }
set
{
_bitmapSource = value;
Image = Convertor.BitmapSourceToBytes(_bitmapSource);
}
}
}
}
CategoryRepository.cs
usingSystem.Collections.Generic;
usingSystem.Linq;
usingASDC.Model.Classes;
namespaceASDC.Model.InfoMaterials
{
publicclassCategoryRepository
{
privateASDCEntities_entities;
///
///Конструкторкласса
///
///
Ссылканаобъект-хранилище(коннекшен, connection), включающеевсесущности(entities) промапленной(mapping) БД.
publicCategoryRepository(ASDCEntitiesentities)
{
_entities = entities;
}
///
/// Функция выбирает категорию по заданному идентификатору (id)
///
///
Идентификатор категории, которую нужно выбрать
///
publicCategoryGetCategory(longcategoryId)
{
Categorycategory = _entities.Categories.First(c => c.ID_Category == categoryId);
category.BitmapSource = Convertor.ByteToBitmapSource(category.Image);
return category;
}
///
/// Функция выбирает два уровня категорий
///
///
publicListCategory> GetCategories()
{
varcategories = GetSubCategories(0);
foreach(varcategory incategories)
{
category.Children = GetSubCategories(category.ID_Category);
}
return categories.ToList();
}
///
/// Функция рекурсивно выбирает все категории
///
///
Категория, подкатегории которой нужно выбрать
///
publicListCategory> GetCategories(longcategoryId)
{
varcategories = GetSubCategories(categoryId);
if(categories != null)
{
foreach(varcategory incategories)
{
category.Children = GetCategories(category.ID_Category);
}
}
return categories;
}
///
/// Функция выбирает подкатегории заданной категории
///
///
Категория, подкатегории которой нужно выбрать
///
publicListCategory> GetSubCategories(longcategoryId)
{
varcategories = (fromc in_entities.Categories
wherecategoryId == 0? (c.ParentCategory == categoryId || c.ParentCategory == null): (c.ParentCategory == categoryId)
selectc).ToList();
foreach(varcategory incategories)
{
category.BitmapSource = Convertor.ByteToBitmapSource(category.Image);
}
return categories;
}
///
/// Функция добавления новой категории
///
///
Новая категория в виде класса категории
///
publicCategoryInsertCategory(Categorycategory)
{
_entities.AddToCategories(category);
returncategory;
}
publicvoidDeleteCategory(Categorycategory)
{
_entities.DeleteObject(category);
}
publicvoidSaveChanges()
{
_entities.SaveChanges();
}
}
}
InfoMaterial.cs
usingSystem.Windows.Media.Imaging;
usingASDC.Model.Classes;
namespaceASDC.Model.InfoMaterials
{
publicpartialclassInfoMaterial
{
privateBitmapImage_bitmapSource;
publicBitmapImageBitmapSource
{
get{ return_bitmapSource; }
set
{
_bitmapSource = value;
Image.Image = Convertor.BitmapSourceToBytes(_bitmapSource);
}
}
}
}
InfoMaterialRepository.cs
usingSystem.Collections.Generic;
usingSystem.Linq;
usingASDC.Model.Classes;
namespaceASDC.Model.InfoMaterials
{
publicclassInfoMaterialRepository
{
privateASDCEntities_entities;
publicInfoMaterialRepository(ASDCEntitiesentities)
{
_entities = entities;
}
publicListInfoMaterial> GetInfoMaterialsByFilter(Filterfilter)
{
varinfoMaterials = fromim in_entities.InfoMaterials.Include(«Image»)
where(im.PublishDate >= filter.DateFrom && im.PublishDate
selectim;
if(filter.NumberOfRows
filter.NumberOfRows = int.MaxValue;
if(!string.IsNullOrEmpty(filter.Name))
infoMaterials = infoMaterials.Where(im => im.Name.Contains(filter.Name)).Take(filter.NumberOfRows);
if(filter.ByRating)
{
if(filter.SortDirection == SortDirectionType.Top)
infoMaterials = infoMaterials.OrderByDescending(im => im.Rating).Take(filter.NumberOfRows);
else
infoMaterials = infoMaterials.OrderBy(im => im.Rating).Take(filter.NumberOfRows);
}
if(filter.ByViewCount)
if(filter.SortDirection == SortDirectionType.Top)
infoMaterials = infoMaterials.OrderByDescending(im => im.ViewCount).Take(filter.NumberOfRows);
else
infoMaterials = infoMaterials.OrderBy(im => im.ViewCount).Take(filter.NumberOfRows);
returnConvertInfoMaterialImageToBitmapSource(infoMaterials.ToList());
}
publicListInfoMaterial> GetShortInfoMaterialsByCategory(longcategoryId)
{
varinfoMaterials = (fromim in_entities.InfoMaterials.Include(«Image»).Include(«Comments»)
whereim.Category.ID_Category == categoryId
selectim).ToList();
returnConvertInfoMaterialImageToBitmapSource(infoMaterials);
}
privateListInfoMaterial> ConvertInfoMaterialImageToBitmapSource(ListInfoMaterial> infoMaterials)
{
foreach(varinfoMaterial ininfoMaterials)
{
if(infoMaterial.Image != null)
infoMaterial.BitmapSource = Convertor.ByteToBitmapSource(infoMaterial.Image.Image);
}
returninfoMaterials;
}
publicInfoMaterialGetInfoMaterial(longmaterialId)
{
varinfoMaterial = (fromim in_entities.InfoMaterials.Include(«Image»).Include(«Comments»)
whereim.ID_InfoMaterial == materialId
selectim).First();
if(infoMaterial.Image != null)
infoMaterial.BitmapSource = Convertor.ByteToBitmapSource(infoMaterial.Image.Image);
returninfoMaterial;
}
publicInfoMaterialInsertInfoMaterial(InfoMaterialmaterial)
{
_entities.AddToInfoMaterials(material);
if(material.Image != null)
_entities.AddToInfoMat_Image(material.Image);
returnmaterial;
}
publicInfoMaterialInsertComments(InfoMaterialmaterial)
{
foreach(varcomment inmaterial.Comments.ToList())
{
_entities.AddToComments(comment);
}
returnmaterial;
}
publicvoidDeleteInfoMaterial(InfoMaterialmaterial)
{
_entities.DeleteObject(material);
}
publicvoidSaveChanges()
{
_entities.SaveChanges();
}
}
InfoMaterialsDataManager.cs
namespaceASDC.Model.InfoMaterials
{
publicclassInfoMaterialsDataManager
{
privateASDCEntities_entities;
privateCategoryRepository_categoryRepository;
privateInfoMaterialRepository_infoMaterialRepository;
publicInfoMaterialsDataManager()
{
_entities = newASDCEntities();
}
publicCategoryRepositoryCategoryRepository
{
get
{
if(_categoryRepository == null)
_categoryRepository = newCategoryRepository(_entities);
return_categoryRepository;
}
}
publicInfoMaterialRepositoryInfoMaterialRepository
{
get
{
if(_infoMaterialRepository == null)
_infoMaterialRepository = newInfoMaterialRepository(_entities);
return_infoMaterialRepository;
}
}
}
}