Реферат

Реферат Проектирование базы данных 5

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.9.2024




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

прикладному программированию

на тему:

ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ


Преподаватель:
Студент:
Группа:

Санкт-Петербург

2010
Содержание

1. Формулировка задания 3

2. Описание БД 4

3. Описание интерфейса программы 6

3.1. Окно «Категории информационных материалов» 6

3.2. Окно «Информационные материалы» 6

3.3. Окно «Информационный материал» 7

3.4. Окно «Редактирование информационного материала» 7

3.5. Окно «Добавление информационного материала» 8

3.6. Окно «Фильтрация информационных материалов» 8

4. Перечень запросов LINQ to Entities, используемых в приложении 10

5. Листинг программы 12

App.xaml 12

CategoriesWindow.xaml 13

CategoriesWindow.xaml.cs 15

InfoMaterialAddEditWindow.xaml 18

InfoMaterialAddEditWindow.xaml.cs 20

InfoMaterialsFilterWindow.xaml 21

 23

InfoMaterialsFilterWindow.xaml.cs 23

 25

InfoMaterialsWindow.xaml 25

InfoMaterialsWindow.xaml.cs 26

InfoMaterialWindow.xaml 29

InfoMaterialWindow.xaml.cs 31

Convertor.cs 32

Filter.cs 33

 34

Category.cs 34

CategoryRepository.cs 35

InfoMaterial.cs 37

InfoMaterialRepository.cs 37

InfoMaterialsDataManager.cs 39

1. Формулировка задания


Практическое задание на тему «Проектирование БД» подразумевает выполнение следующих задач:

  • определение объектов и их характеристик, которые необходимо хранить в БД (определение исходных данных для проектирования структуры БД);

  • разработка структуры БД;

  • разработка уровня доступа к данным;

  • создание пользовательского интерфейса для работы с БД.


2. Описание БД




Для хранения БД были выбраны объекты, принадлежащие к области «Информационные материалы». Ключевым объектов хранения является информационный материал, включающий следующие характеристики:

  • название;

  • категорию информационного материала;

  • текстовое содержание материала;

  • видеоматериалы;

  • изображения;

  • аннотация к материалу;

  • указание на того, кто добавил материал;

  • дата публикации;

  • комментарии;

  • количество просмотров;

  • количество голосов;

  • общий рейтинг материала (сумма всех опубликованных пользователями рейтингов);

  • флаг, доступны ли комментарии к материалу или нет;

  • флаг, определяющий в архиве или нет материал;

  • флаг, определяющий одобрен ли к публикации материал.

На основе исходных данных по предметной области выделены следующие сущности:

  • информационный материал;

  • категория информационного материала;

  • комментарий;

  • видеоматериал;

  • изображение.

По сущностям построены таблицы со следующими полями:

Таблица InfoMat_Category




Название

Тип даных

PK

ID_Category

bigint




Name

nchar(30)




Description

nvarchar(max)




Image

image




ParentCategory

bigint




Таблица InfoMat_InfoMaterial




Название

Тип даных

PK

ID_InfoMaterial

bigint

FK

ID_Category

bigint

FK

ID_Image

bigint




Name

nvarchar(100)




Text

text




Annotation

nvarchar(max)




Votes

int




TotalRating

int




Rating

float




ViewCount

int




PublishDate

datetime




HasComments

bit




IsApproved

bit




IsArchived

bit


Таблица InfoMat_Image




Название

Тип даных

PK

ID_Image

bigint

FK

ID_InfoMaterial

bigint




Image

image


Таблица InfoMat_Video




Название

Тип даных

PK

ID_Video

bigint

FK

ID_InfoMaterial

bigint




Video

varbinary(max)


Таблица InfoMat_Comment




Название

Тип даных

PK

ID_Comment

bigint

FK

ID_InfoMaterial

bigint




Text

nvarchar(max)




Image

image




AddingDate

datetime




IsDeleted

bit

Связи между таблицами представлены на рисунке 1.






Рисунок 1 - Структура БД

3. Описание интерфейса программы



3.1. Окно «Категории информационных материалов»


После запуска программы появляется окно пользовательского интерфейса «Категории информационных материалов», представленное на рисунке 2.

Основными элементы окна, выделенные на рисунке прямоугольниками:

  1. Область, в которой отображаются категории информационных материалов.

  2. Кнопка фильтрации (выбора по признакам) информационных материалов.

  3. Кнопка удаления выбранной категории.

  4. Кнопка добавления новой категории.

  5. Кнопка сохранения сделанных изменений.

  6. Кнопка возврата из подкатегории, если пользователь просматривает подкатегории выбранной категории.

  7. Кнопка, предоставляющая ряд действий: фильтрация, сортировка категорий.

  8. Область, включающая два текстовых поля и кнопку выбора изображения. Эта область используется для редактирования существующих категорий и ввода информации для добавляемых категорий.






Рисунок 2 - Окно «Категории информационных материалов»

  1. Copyrights (авторские права).

  2. Область для выбора изображения. После нажатия на кнопку в этой области появляется диалоговое окно, предоставляющее возможность выбора изображения.

  3. Область, в которой отображена подсказка по перемещению по категориям.

3.2. Окно «Информационные материалы»


После двойного щелчка по категории, не имеющей подкатегории (в том случае, если она имеет подкатегории, осуществляется переход к подкатегориям), открывается окно пользовательского интерфейса «Информационные материалы», представленное на рисунке 3.

Основные элементы окна, выделенные на рисунке прямоугольниками:

  1. Область, представляющая собой краткую информацию об информационном материале: изображение, название, краткое описание, дату публикации, количество просмотров, рейтинг материала.

  2. Кнопка просмотра выбранного информационного материала. Также просмотр материала можно осуществлять двойным щелчком по нему.

  3. Кнопка удаления выбранного материала.

  4. Кнопка редактирования выбранного информационного материала.

  5. 

  6. Кнопка добавления нового информационного материала.




Рисунок 3 - Окно «Информационные материалы»

3.3. Окно «Информационный материал»


Для просмотра информационного материала, т.е. для просмотра полной информации о нём: полного текста, комментариев, необходимо нажать кнопку 2, после чего появляется окно пользовательского интерфейса «Информационный материал». Это окно представлено на рисунке 4.

Основные элементы окна, выделенные на рисунке прямоугольниками:

  1. Область, содержащая основную информацию материала.

  2. Область, в которой отображаются комментарии.

  3. Кнопка удаления выбранного комментария.

  4. Область, предоставляющая возможность пользователю оставить свой комментарий.

  5. Кнопка, добавляющая набранный комментарий к уже существующим.






Рисунок 4 - Окно «Информационный материал»

3.4. Окно «Редактирование информационного материала»


Для редактирования информационного материала необходимо в окне «Информационные материалы» нажать кнопку 4, после чего появится окно пользовательского интерфейса «Редактирование информационного материала». Окно представлено на рисунке 5.

В окне имеется возможность редактирования соответствующих текстовых полей и выбора нового изображения для информационного материала. Для подтверждения сделанных изменений необходимо нажать кнопку OK.






Рисунок 5 - Окно «Редактирование информационного материала»

3.5. Окно «Добавление информационного материала»


Для добавления информационного материала необходимо в окне «Информационные материалы» нажать кнопку 5, после чего появится окно пользовательского интерфейса «Добавление информационного материала». Окно представлено на рисунке 6.

В окне имеется возможность заполнения соответствующих текстовых полей и выбора изображения для информационного материала. Для подтверждения добавления нового информационного материала необходимо нажать кнопку OK.






Рисунок 6 - Окно «Добавление информационного материала»

3.6. Окно «Фильтрация информационных материалов»


При щелчке по кнопке 2 окна пользовательского интерфейса «Категории информационных материалов», представленного на рисунке 2, появляется окно пользовательского интерфейса «Фильтрация информационных материалов», показанное на рисунке 7.






Рисунок 7 - Окно «Фильтрация информационных материалов»

Основные элементы окна, выделенные на рисунке прямоугольниками:

  1. Область, в которой задаются параметры фильтрации информационных материалов.

  2. Текстовое поле, в котором можно задать часть названия или полное название информационного материала.

  3. Параметр фильтрации, определяющий такой критерий фильтрации, как «Рейтинг» или «Популярность». «Рейтинг» - это средняя оценка пользователями материала. «Популярность» - это количество просмотров пользователями материала.

  4. Поле, в котором задается количество выводимых в результате фильтрации записей. Введенный по умолчанию 0 означает, что нужно выводить все записи фильтрации.

  5. Направление сортировки: начиная с лучших (стрелка на зеленом фоне) или начиная с худших (стрелка на красном фоне) (по «Рейтингу» или «Популярности»).

  6. 

  7. Дата публикации позволяет задать календарным период, за который он хочет просмотреть материалы.

  8. Кнопка фильтрации информационных материалов по заданным параметрам.

  9. Область, в которой отображаются результаты фильтрации.

Все кнопки окон имеют всплывающие подсказки, позволяющий пользователю быстро освоить интерфейс.

4. Перечень запросов LINQ to Entities, используемых в приложении


В результате объектно-реляционного отображения (маппинга) (object-relational mapping, ORM) по средствам ADO.NET Entity Framework сформировалась объектная модель, представленная на рисунке 7.




Рисунок 7 - Объектная модель приложения

Запросы к БД осуществлялись уже не напрямую, а через используемый ORM с применением LINQ to Entities (Language-Integrated Query).

Для взаимодействия с БД в приложении были написаны следующие запросы:

  • получение категорий:



from c in _entities.Categories

where categoryId == 0 ? (c.ParentCategory == categoryId || c.ParentCategory == null) : (c.ParentCategory == categoryId)

select c

  • получение информационных материалов:

from im in _entities.InfoMaterials.Include("Image").Include("Comments")

where im.Category.ID_Category == categoryId

select im

  • получение информационного материала:

(from im in _entities.InfoMaterials.Include("Image").Include("Comments")

where im.ID_InfoMaterial == materialId

select im).First()

  • многопараметрический запрос фильтрации информационных материалов:

var infoMaterials = from im in _entities.InfoMaterials.Include("Image")

where (im.PublishDate >= filter.DateFrom && im.PublishDate <= filter.DateTo)

select im;
if (filter.NumberOfRows <= 0)

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


<Application x:Class="WpfRDB.App"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://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>

<DataTemplate x:Key="DetailCoreTemplate">

<Core:MeasurePixelSnapper>

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="4" />

<RowDefinition Height="Auto" />

<RowDefinition Height="4" />

Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="4" />

<ColumnDefinition Width="Auto"/>

<ColumnDefinition Width="12"/>

<ColumnDefinition/>

Grid.ColumnDefinitions>

<Border Grid.Column="1" Grid.Row="1" BorderBrush="Black" BorderThickness="1">

<Image Source="{Binding DataContext.BitmapSource}" Height="128" Width="128" Name="imgInfoMat" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Top"/>

Border>

<Grid Grid.Column="3" Grid.Row="1">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="Auto" MinWidth="125" />

<ColumnDefinition Width="12"/>

<ColumnDefinition/>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="26"/>

<RowDefinition Height="42"/>

<RowDefinition Height="20"/>

<RowDefinition Height="20"/>

<RowDefinition Height="20" />

Grid.RowDefinitions>

<TextBlock Grid.Column="0" Grid.Row="0" Text="Название:"/>

<TextBlock Grid.Column="0" Grid.Row="1" Text="Описание:"/>

<TextBlock Grid.Column="0" Grid.Row="2" Text="Дата публикации:"/>

<TextBlock Grid.Column="0" Grid.Row="3" Text="Количество просмотров:"/>

<TextBlock Grid.Column="0" Grid.Row="4" Text="Рейтинг:"/>

<TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding DataContext.Name}"/>



<TextBlock Grid.Column="2" Grid.Row="1" Text="{Binding DataContext.Annotation}" TextWrapping="WrapWithOverflow"/>

<TextBlock Grid.Column="2" Grid.Row="2" Text="{Binding DataContext.PublishDate, Converter={Core:FormatStringConverter D}}"/>

<TextBlock Grid.Column="2" Grid.Row="3" Text="{Binding DataContext.ViewCount}"/>

<TextBlock Grid.Column="2" Grid.Row="4" Text="{Binding DataContext.Rating}"/>

Grid>

Grid>

Core:MeasurePixelSnapper>

DataTemplate>

ResourceDictionary>

Application.Resources>

Application>

CategoriesWindow.xaml


<Window x:Class="WpfRDB.CategoriesWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"

xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"

xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"

Title="Категории информационных материалов" Height="592" Width="800" Loaded="Window_Loaded" MinHeight="592"

Icon="Images/yinyang.png" Closing="Window_Closing">

<Grid Margin="0,0,0,0" dx:ThemeManager.ThemeName="Office2007Blue">

<Grid.RowDefinitions>

<RowDefinition Height="402*" />

<RowDefinition Height="165*" />

Grid.RowDefinitions>

<dxg:GridControl Name="grdCategories" Margin="2,2,2,2">

<dxg:GridControl.Columns>

<dxg:GridColumn FieldName="Name">Категорияdxg:GridColumn>

<dxg:GridColumn FieldName="BitmapSource" AllowColumnFiltering="False">

<dxg:GridColumn.CellTemplate>

<DataTemplate>

<Image Source="{Binding Path=Value}" HorizontalAlignment="Left" Margin="8,3,0,3" Stretch="Fill" />

DataTemplate>

dxg:GridColumn.CellTemplate>

dxg:GridColumn>

<dxg:GridColumn FieldName="Description" MinWidth="100" EditSettings="{dxe:MemoSettings ShowIcon=False, PopupWidth=500, PopupHeight=300, MemoTextWrapping=Wrap, MemoVerticalScrollBarVisibility=Auto}">Описаниеdxg:GridColumn>

dxg:GridControl.Columns>

<dxg:GridControl.View>

<dxg:CardView ShowGroupPanel="False" IsColumnChooserVisible="False" AllowEditing="False" ShowGroupedColumns="True" CardAlignment="Center" CardLayout="Columns" MaxCardCountInRow="1" NavigationStyle="Cell" FixedSize="250" MinFixedSize="150" Name ="view" CardHeaderDisplayMemberBinding="{Binding Path=Data.Name, RelativeSource={RelativeSource Self}}" MouseDoubleClick="view_MouseDoubleClick" FocusedRowChanged="view_FocusedRowChanged" />

dxg:GridControl.View>

dxg:GridControl>



<GroupBox Grid.Row="1" x:Name="panel" DataContext="{Binding Path=View.FocusedRowData, ElementName=grdCategories}" Margin="0,0,0,1" Height="153.674" VerticalAlignment="Bottom">

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="128">ColumnDefinition>

<ColumnDefinition Width="*">ColumnDefinition>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="128">RowDefinition>

Grid.RowDefinitions>

<Border BorderThickness="1" BorderBrush="Black" Height="128" Width="128">

<Image Source="{Binding DataContext.BitmapSource}" Name="imgCategory" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0"/>

Border>

<Button Name="btnLoadImage" Margin="0,0,1,1" Height="22" Width="22" HorizontalAlignment="Right" VerticalAlignment="Bottom" Click="btnLoadImage_Click">

<Image ToolTip="Выбрать изображение">

<Image.Source>pack://application:,,,/Images/folder_out.pngImage.Source>

Image>

Button>

<Grid Grid.Column="1" Margin="16,0,0,0">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="Auto" MinWidth="56" />

<ColumnDefinition Width="6"/>

<ColumnDefinition/>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="Auto"/>

<RowDefinition Height="4"/>

<RowDefinition Height="18" />

<RowDefinition Height="4"/>

<RowDefinition Height="Auto"/>

<RowDefinition Height="4"/>

<RowDefinition Height="60" />

<RowDefinition Height="4"/>

<RowDefinition Height="*"/>

Grid.RowDefinitions>

<TextBlock Grid.Column="0" Grid.Row="2" Text="Категория:"/>

<TextBlock Grid.Column="0" Grid.Row="6" Text="Описание:"/>

<dxe:TextEdit Name="txtCategoryName" Grid.Column="2" Grid.Row="2" Text="{Binding DataContext.Name}" EditValueChanged="TextBox_EditValueChanged" GotFocus="TextBox_GotFocus" />

<dxe:TextEdit Name="txtDescription" Grid.Column="2" Grid.Row="6" VerticalContentAlignment="Top" VerticalScrollBarVisibility="Auto" Text="{Binding DataContext.Description}" TextWrapping="WrapWithOverflow" EditValueChanged="TextBox_EditValueChanged" GotFocus="TextBox_GotFocus"/>

<TextBlock Grid.Column="2" Grid.Row="8" VerticalAlignment="Bottom" HorizontalAlignment="Right" Height="13.277" Width="231" Text="© TSSoft. IMat, 2010. Все права защищены." Foreground="DarkGray" />

Grid>

Grid>

GroupBox>



<Button Height="22" Width="22" HorizontalAlignment="Right" Margin="0,5,42,0" Name="btnPrev" VerticalAlignment="Top" Click="btnPrev_Click">

<Image ToolTip="Назад">

<Image.Source>pack://application:,,,/Images/nav_left_blue.pngImage.Source>

Image>

Button>

<Button Width="22" Height="22" HorizontalAlignment="Right" Margin="0,5,130,0" Name="btnNew" Click="btnNew_Click" VerticalAlignment="Top">

<Image ToolTip="Добавить категорию">

<Image.Source>pack://application:,,,/Images/window_add.pngImage.Source>

Image>

Button>

<Button Width="22" Height="22" HorizontalAlignment="Right" Margin="0,5,161,0" Name="btnDelete" Click="btnDelete_Click" VerticalAlignment="Top">

<Image ToolTip="Удалить категорию">

<Image.Source>pack://application:,,,/Images/window_delete.pngImage.Source>

Image>

Button>

<Button Width="22" Height="22" HorizontalAlignment="Right" Name="btnSave" Click="btnSave_Click" Margin="0,5,85,0" VerticalAlignment="Top">

<Image ToolTip="Сохранить">

<Image.Source>pack://application:,,,/Images/disk_blue.pngImage.Source>

Image>

Button>

<TextBlock Height="18" Margin="10,9,383,0" VerticalAlignment="Top" Text="Переход в подкатегорию осуществляется двойным щелчком по категории" Foreground="RoyalBlue" />

Grid>

Window>

CategoriesWindow.xaml.cs


using System.Collections.Generic;

using System.IO;

using System.Windows;

using System.Windows.Forms;

using System.Windows.Media.Imaging;

using ASDC.Model.InfoMaterials;

using MessageBox=System.Windows.Forms.MessageBox;

namespace WpfRDB

{

///

/// Interaction logic for Window1.xaml

///


public partial class CategoriesWindow

{

private InfoMaterialsDataManager _dataManager;

private object _prevDataSource;

private Category _currentParentCategory;

private bool _needForSave;

private bool _focusedRowChanged;


public CategoriesWindow()

{



InitializeComponent();

_dataManager = new InfoMaterialsDataManager();

}


private void InitCategoriesGrid()

{

grdCategories.DataSource = _dataManager.CategoryRepository.GetCategories();

grdCategories.RefreshData();

}


private void Window_Loaded(object sender, RoutedEventArgs e)

{

InitCategoriesGrid();

}


private void btnNew_Click(object sender, RoutedEventArgs e)

{

grdCategories.BeginDataUpdate();


var c = new Category{ParentCategory = _currentParentCategory != null ? _currentParentCategory.ID_Category : 0,

Parent = _currentParentCategory};

((List<Category>)grdCategories.DataSource).Add(c);

_dataManager.CategoryRepository.InsertCategory(c);

_needForSave = true;


grdCategories.EndDataUpdate();

grdCategories.View.MoveLastRow();

}


private void btnLoadImage_Click(object sender, RoutedEventArgs e)

{

var dlg = new OpenFileDialog();

dlg.Filter = "Image files: *.jpg, *.png, *.bmp | *.jpg; *.png; *.bmp";


if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)

{

System.Drawing.Image img = System.Drawing.Image.FromFile(dlg.FileName);

BitmapImage bitmap = new BitmapImage();


bitmap.BeginInit();

MemoryStream ms = new MemoryStream();

img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

ms.Seek(0, SeekOrigin.Begin);

bitmap.StreamSource = ms;

bitmap.EndInit();


var c = (Category) grdCategories.GetFocusedRow();

c.BitmapSource = bitmap;

grdCategories.RefreshData();

_needForSave = true;

}

}


private void btnSave_Click(object sender, RoutedEventArgs e)

{

Save();

}


private void btnDelete_Click(object sender, RoutedEventArgs e)

{



if (grdCategories.View.SelectedRows.Count > 0)

{

if (MessageBox.Show("Вы действительно хотите удалить выбранную категорию?", "Сообщение",

MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)

{

grdCategories.BeginDataUpdate();


var c = (Category) grdCategories.GetFocusedRow();

_dataManager.CategoryRepository.DeleteCategory(c);

((List<Category>) (grdCategories.DataSource)).Remove(c);

_needForSave = true;


grdCategories.EndDataUpdate();

}

}

}


private void view_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)

{

int rowHandle = grdCategories.View.GetRowHandleByMouseEventArgs(e);

if (grdCategories.IsValidRowHandle(rowHandle))

{

if (AskForSave())

Save();


var c = (Category) grdCategories.GetFocusedRow();


if (c.Children != null)

{

_currentParentCategory = c;

_prevDataSource = grdCategories.DataSource;

grdCategories.DataSource = c.Children;

grdCategories.RefreshData();

}

else

{

var infoMaterialsWindow = new InfoMaterialsWindow(_dataManager, c);

infoMaterialsWindow.Show();

}

}

}


private void Save()

{

if (_needForSave)

{

_dataManager.CategoryRepository.SaveChanges();

_needForSave = false;

}

}


private bool AskForSave()

{

if (_needForSave)

{

if (MessageBox.Show("Сохранить сделанные изменения?","Сообщение", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)

{



return true;

}

}

return false;

}


private void btnPrev_Click(object sender, RoutedEventArgs e)

{

if (_prevDataSource != null)

grdCategories.DataSource = _prevDataSource;

}


private void view_FocusedRowChanged(object sender, DevExpress.Wpf.Grid.FocusedRowChangedEventArgs e)

{

_focusedRowChanged = true;

}


private void TextBox_EditValueChanged(object sender, DevExpress.Wpf.Editors.EditValueChangedEventArgs e)

{

if (!_focusedRowChanged)

_needForSave = true;

}


private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

if (AskForSave())

Save();

}


private void TextBox_GotFocus(object sender, RoutedEventArgs e)

{

_focusedRowChanged = false;

}

}

}

InfoMaterialAddEditWindow.xaml


<Window x:Class="WpfRDB.InfoMaterialAddEditWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://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">

<Grid dx:ThemeManager.ThemeName="Office2007Blue" x:Name="grBase">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="4" />

<ColumnDefinition/>

<ColumnDefinition Width="4"/>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="24" />

<RowDefinition Height="7" />

<RowDefinition Height="128" />

<RowDefinition Height="4" />



<RowDefinition Height="16" />

<RowDefinition Height="4" />

<RowDefinition Height="445*" />

<RowDefinition Height="4" />

<RowDefinition Height="28" />

<RowDefinition Height="4" />

Grid.RowDefinitions>

<TextBlock Grid.Column="1" HorizontalAlignment="Left" Width="64" Text="Заголовок:" Margin="0,3" />

<dxe:TextEdit Grid.Column="1" Margin="0,0,3,2" Name="txtHeader" Text="{Binding Name}" FontSize="14" FontWeight="Bold" HorizontalAlignment="Right" Width="629" Grid.ColumnSpan="2" />

<Border Grid.Column="1" Grid.Row="1" VerticalAlignment="Top" Height="1" BorderThickness="1" BorderBrush="Black">Border>


<Grid Grid.Row="2" Grid.Column="1">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="128"/>

<ColumnDefinition Width="4"/>

<ColumnDefinition Width="200*"/>

Grid.ColumnDefinitions>

<Border Grid.Column="0" BorderThickness="1" BorderBrush="Black">

<Image Width="128" HorizontalAlignment="Left" Name="imgPicture" Stretch="Fill" Source="{Binding BitmapSource}" />

Border>

<Button Height="22" Width="22" HorizontalAlignment="Right" Margin="0,0,1,1" Name="btnLoadImage" VerticalAlignment="Bottom" Click="btnLoadImage_Click">

<Image ToolTip="Выбрать изображение">

<Image.Source>pack://application:,,,/Images/folder_out.pngImage.Source>

Image>

Button>

<TextBlock Grid.Column="2" Height="19" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Text="Аннотация:" />

<dxe:TextEdit Grid.Column="2" Name="txtAnnotation" TextWrapping="WrapWithOverflow" VerticalContentAlignment="Top" Text="{Binding Annotation}" Margin="0,20,0,0" />

Grid>

<TextBlock Grid.Row="4" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="132" Text="Текст:" />

<dxe:TextEdit Grid.Row="6" Grid.Column="1" Name="txtText" TextWrapping="WrapWithOverflow" VerticalContentAlignment="Top" Text="{Binding Text}" />


<Button Grid.Row="8" Grid.Column="1" HorizontalAlignment="Right" Name="btnOK" Width="75" Click="btnOK_Click">OKButton>

Grid>

Window>

InfoMaterialAddEditWindow.xaml.cs


using System.IO;

using System.Windows;

using System.Windows.Forms;

using System.Windows.Media.Imaging;

using ASDC.Model.InfoMaterials;

namespace WpfRDB

{

///



/// Interaction logic for InfoMaterialAddWindow.xaml

///


public partial class InfoMaterialAddEditWindow

{

private InfoMaterial _infoMaterial;


public InfoMaterialAddEditWindow()

{

InitializeComponent();

}


public InfoMaterialAddEditWindow(InfoMaterial infoMaterial) : this()

{

_infoMaterial = infoMaterial;

}


private void InitDataSources()

{

grBase.DataContext = _infoMaterial;

}


private void RefreshDataSource()

{

grBase.DataContext = null;

grBase.DataContext = _infoMaterial;

}


private void Window_Loaded(object sender, RoutedEventArgs e)

{

InitDataSources();

}


private void btnOK_Click(object sender, RoutedEventArgs e)

{

DialogResult = true;

Close();

}


private void btnLoadImage_Click(object sender, RoutedEventArgs e)

{

var dlg = new OpenFileDialog();

dlg.Filter = "Image files: *.jpg, *.png, *.bmp | *.jpg; *.png; *.bmp";


if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)

{

System.Drawing.Image img = System.Drawing.Image.FromFile(dlg.FileName);

BitmapImage bitmap = new BitmapImage();


bitmap.BeginInit();

MemoryStream ms = new MemoryStream();

img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

ms.Seek(0, SeekOrigin.Begin);

bitmap.StreamSource = ms;

bitmap.EndInit();

if (_infoMaterial.Image == null)

_infoMaterial.Image = new InfoMat_Image();

_infoMaterial.BitmapSource = bitmap;

RefreshDataSource();

}

}



}

}

InfoMaterialsFilterWindow.xaml


<Window x:Class="WpfRDB.InfoMaterialsFilterWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"

Title="Фильтрация информационных материалов" Icon="Images/yinyang.png" Height="588" Width="639" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dx="clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3">

<Grid dx:ThemeManager.ThemeName="Office2007Blue">

<Grid.RowDefinitions>

<RowDefinition Height="120" />

<RowDefinition Height="4" />

<RowDefinition Height="285*" />

Grid.RowDefinitions>

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="4" />

<RowDefinition Height="18" />

<RowDefinition Height="8" />

<RowDefinition Height="18" />

<RowDefinition Height="4" />

<RowDefinition Height="18" />

<RowDefinition Height="4" />

<RowDefinition Height="18" />

<RowDefinition Height="4" />

<RowDefinition Height="18" />

Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="7" />

<ColumnDefinition Width="120" />

<ColumnDefinition Width="10" />

<ColumnDefinition Width="140" />

<ColumnDefinition Width="40" />

<ColumnDefinition Width="120" />

<ColumnDefinition Width="10" />

<ColumnDefinition Width="140" />

<ColumnDefinition Width="7*" />

Grid.ColumnDefinitions>

<Image Grid.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>

<TextBlock Grid.Column="1" Grid.ColumnSpan="5" Grid.Row="1" Text="Параметры фильтрации информационных материалов" Margin="22,0,0,0" VerticalAlignment="Center" />

<Border Grid.Column="0" Grid.ColumnSpan="7" Grid.Row="2" VerticalAlignment="Center" Height="0.5" BorderThickness="0.5" BorderBrush="Navy">Border>

<TextBlock Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="3" Grid.RowSpan="1" Text="Название:"/>

<dxe:TextEdit Grid.Column="3" Grid.Row="3" Grid.RowSpan="1" Name="txtName" />

<dxe:CheckEdit Grid.Column="1" Grid.Row="5" Name="chkRating" Content="Рейтинг" IsChecked="True" Checked="RatingAndViewCount_Checked" Unchecked="RatingAndViewCount_Unchecked" />



<dxe:CheckEdit Grid.Column="3" Grid.Row="5" Name="chkViewCount" Content="Популярность" ToolTip="Количество просмотров" Checked="RatingAndViewCount_Checked" Unchecked="RatingAndViewCount_Unchecked" />

<TextBlock Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="7" Grid.RowSpan="1" Text="Количество:" />

<dxe:SpinEdit Grid.Column="3" Grid.Row="7" Grid.RowSpan="1" Name="speNumberOfRows" IsFloatValue="False" />

<TextBlock Grid.Column="5" Grid.ColumnSpan="1" Grid.Row="3" Grid.RowSpan="1" Text="Дата публикации"/>

<TextBlock Grid.Column="5" Grid.ColumnSpan="1" Grid.Row="5" Grid.RowSpan="1" Text="с:"/>

<dxe:DateEdit Grid.Column="7" Grid.Row="5" Grid.RowSpan="1" Name="dteDateFrom"/>

<TextBlock Grid.Column="5" Grid.ColumnSpan="1" Grid.Row="7" Grid.RowSpan="1" Text="по:"/>

<dxe:DateEdit Grid.Column="7" Grid.Row="7" Grid.RowSpan="1" Name="dteDateTo"/>

<TextBlock Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="9" Grid.RowSpan="1" Text="Направление:"/>

<dxe:CheckEdit Grid.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:CheckEdit Grid.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>

<Button Grid.Column="7" Grid.Row="9" Name="btnFilter" Margin="32,0,0,0" Click="btnFilter_Click">ФильтроватьButton>

Grid>

<Border Grid.Row="1" VerticalAlignment="Center" Height="0.5" BorderThickness="0.5" BorderBrush="Navy">Border>

<dxg:GridControl Grid.Row="2" Name="grdInfoMaterials">

<dxg:GridControl.Columns>

<dxg:GridColumn FieldName="Name">Названиеdxg:GridColumn>

<dxg:GridColumn FieldName="Annotation">Описаниеdxg:GridColumn>

<dxg:GridColumn FieldName="ViewCount">Количество просмотровdxg:GridColumn>

<dxg:GridColumn FieldName="Rating">Рейтингdxg:GridColumn>

<dxg:GridColumn FieldName="PublishDate">Дата публикацииdxg:GridColumn>

dxg:GridControl.Columns>

<dxg:GridControl.View>

<dxg:TableView

Name="view" ShowGroupPanel="False" ShowColumnHeaders="False" NavigationStyle="Row" DataRowTemplate="{DynamicResource DetailCoreTemplate}" AutoWidth="True" MouseDoubleClick="view_MouseDoubleClick">

dxg:TableView>

dxg:GridControl.View>

dxg:GridControl>

Grid>

Window>



InfoMaterialsFilterWindow.xaml.cs


using System;

using System.Collections.Generic;

using ASDC.Model.Classes;

using ASDC.Model.InfoMaterials;

using DevExpress.Wpf.Editors;

namespace WpfRDB

{

///

/// Логика для InfoMaterialsFilterWindow.xaml

///


public partial class InfoMaterialsFilterWindow

{

private InfoMaterialsDataManager _dataManager;

private CheckEdit _curRatingOrViewCount;

private CheckEdit _curTopOrLow;


public InfoMaterialsFilterWindow()

{

InitializeComponent();

_curRatingOrViewCount = chkRating;

_curTopOrLow = chkTop;

}


public InfoMaterialsFilterWindow(InfoMaterialsDataManager dataManager) : this()

{

_dataManager = dataManager;

}


private void view_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)

{

int rowHandle = grdInfoMaterials.View.GetRowHandleByMouseEventArgs(e);

if (grdInfoMaterials.IsValidRowHandle(rowHandle))

{

var infoMaterial = (InfoMaterial) grdInfoMaterials.GetRow(rowHandle);

infoMaterial = _dataManager.InfoMaterialRepository.GetInfoMaterial(infoMaterial.ID_InfoMaterial);

((List<InfoMaterial>) grdInfoMaterials.DataSource)[grdInfoMaterials.GetRowListIndex(rowHandle)] =

infoMaterial;

ViewMaterial(infoMaterial);

}

}


private void btnFilter_Click(object sender, System.Windows.RoutedEventArgs e)

{

var filter = new Filter();

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 : new DateTime(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();

}


private void RatingAndViewCount_Checked(object sender, System.Windows.RoutedEventArgs e)

{

_curRatingOrViewCount = (CheckEdit) sender;

if (sender.Equals(chkRating))

chkViewCount.IsChecked = false;

else

chkRating.IsChecked = false;


}


private void TopAndLow_Checked(object sender, System.Windows.RoutedEventArgs e)

{

_curTopOrLow = (CheckEdit) sender;

if (sender.Equals(chkTop))

chkLow.IsChecked = false;

else

chkTop.IsChecked = false;

}


private void RatingAndViewCount_Unchecked(object sender, System.Windows.RoutedEventArgs e)

{

var chk = (CheckEdit)sender;

if (chk.Equals(_curRatingOrViewCount))

chk.IsChecked = true;

}


private void TopAndLow_Unchecked(object sender, System.Windows.RoutedEventArgs e)

{

var chk = (CheckEdit)sender;

if (chk.Equals(_curTopOrLow))

chk.IsChecked = true;

}


private void ViewMaterial(InfoMaterial infoMaterial)

{


var imWindow = new InfoMaterialWindow(infoMaterial);

imWindow.ShowDialog();

Save();

}


private void Save()

{

_dataManager.InfoMaterialRepository.SaveChanges();

}

}

}



InfoMaterialsWindow.xaml


<Window x:Class="WpfRDB.InfoMaterialsWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://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">

<Grid dx:ThemeManager.ThemeName="Office2007Blue">

<Grid.RowDefinitions>

<RowDefinition Height="24" />

<RowDefinition Height="2" />

<RowDefinition Height="369*" />

Grid.RowDefinitions>

<Image Width="16" HorizontalAlignment="Left" Margin="4,4,0,4" Name="image1" Stretch="Fill">

<Image.Source>pack://application:,,,/Images/information.pngImage.Source>

Image>

<TextBlock HorizontalAlignment="Left" Margin="26,4,0,4" Name="tbHeader" Text="Информационные материалы" Width="160" />

<dxg:GridControl Grid.Row="2" Name="grdInfoMaterials" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid">

<dxg:GridControl.Columns>

<dxg:GridColumn FieldName="Name">Названиеdxg:GridColumn>

<dxg:GridColumn FieldName="Annotation">Описаниеdxg:GridColumn>

<dxg:GridColumn FieldName="ViewCount">Количество просмотровdxg:GridColumn>

<dxg:GridColumn FieldName="Rating">Рейтингdxg:GridColumn>

<dxg:GridColumn FieldName="PublishDate">Дата публикацииdxg:GridColumn>

dxg:GridControl.Columns>

<dxg:GridControl.View>

<dxg:TableView

Name="view" ShowGroupPanel="False" ShowColumnHeaders="False" NavigationStyle="Row" DataRowTemplate="{DynamicResource DetailCoreTemplate}" AutoWidth="True" MouseDoubleClick="view_MouseDoubleClick">

dxg:TableView>

dxg:GridControl.View>

dxg:GridControl>

<Button HorizontalAlignment="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>

<Button HorizontalAlignment="Right" Margin="0,2,37,0" Name="btnEdit" Width="22" Click="btnEdit_Click">



<Image.Source>pack://application:,,,/Images/window_edit.pngImage.Source>

Image>

Button>

<Button HorizontalAlignment="Right" Margin="0,2,66,0" Name="btnDelete" Width="22" Click="btnDelete_Click">



<Image.Source>pack://application:,,,/Images/window_delete.pngImage.Source>



Image>

Button>

<Button HorizontalAlignment="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>

InfoMaterialsWindow.xaml.cs


using System.Collections.Generic;

using System.Windows.Forms;

using System.Windows.Input;

using ASDC.Model.InfoMaterials;

using InfoMaterial=ASDC.Model.InfoMaterials.InfoMaterial;

namespace WpfRDB

{

///

/// Interaction logic for InfoMaterialWindow.xaml

///


public partial class InfoMaterialsWindow

{

// TODO: Написать Convertor для Image.Source, который будет переводить байты в BitmapSource и подвязать его на Binding

private InfoMaterialsDataManager _dataManager;

private Category _category;


public InfoMaterialsWindow()

{

InitializeComponent();

}


public InfoMaterialsWindow(InfoMaterialsDataManager dataManager, Category category) : this()

{

_dataManager = dataManager;

_category = category;

}


public void InitGrid()

{

grdInfoMaterials.DataSource = _dataManager.InfoMaterialRepository.GetShortInfoMaterialsByCategory(_category.ID_Category);

grdInfoMaterials.RefreshData();

}


private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e)

{

if (_dataManager == null)

_dataManager = new InfoMaterialsDataManager();

InitGrid();

}


private void view_MouseDoubleClick(object sender, MouseButtonEventArgs e)

{



int rowHandle = grdInfoMaterials.View.GetRowHandleByMouseEventArgs(e) ;

if (grdInfoMaterials.IsValidRowHandle(rowHandle))

{

ViewMaterial((InfoMaterial) grdInfoMaterials.GetRow(rowHandle));

}

}


private void btnAdd_Click(object sender, System.Windows.RoutedEventArgs e)

{

var newInfoMaterial = new InfoMaterial {Category = _category};

var imAddEditWindow = new InfoMaterialAddEditWindow(newInfoMaterial);

imAddEditWindow.Title = "Добавление информационного материала";

if (imAddEditWindow.ShowDialog() == true)

{

grdInfoMaterials.BeginDataUpdate();

((List<InfoMaterial>) grdInfoMaterials.DataSource).Add(newInfoMaterial);

grdInfoMaterials.EndDataUpdate();

_dataManager.InfoMaterialRepository.InsertInfoMaterial(newInfoMaterial);

Save();

}

}


private void Save()

{

_dataManager.InfoMaterialRepository.SaveChanges();

}


private void btnEdit_Click(object sender, System.Windows.RoutedEventArgs e)

{

if (grdInfoMaterials.View.SelectedRows.Count > 0)

{

grdInfoMaterials.BeginDataUpdate();

var imAddEditWindow = new InfoMaterialAddEditWindow(((InfoMaterial)grdInfoMaterials.GetFocusedRow()));

imAddEditWindow.Title = "Редактирование информационного материала";

imAddEditWindow.ShowDialog();

grdInfoMaterials.EndDataUpdate();

Save();

}

}


private void btnDelete_Click(object sender, System.Windows.RoutedEventArgs e)

{

if (grdInfoMaterials.View.SelectedRows.Count > 0)

{

if (MessageBox.Show("Вы действительно хотите удалить выбранный материал?", "Сообщение",

MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)

{

grdInfoMaterials.BeginDataUpdate();


var infoMaterial = (InfoMaterial) grdInfoMaterials.GetFocusedRow();



_dataManager.InfoMaterialRepository.DeleteInfoMaterial(infoMaterial);

((List<InfoMaterial>)(grdInfoMaterials.DataSource)).Remove(infoMaterial);


grdInfoMaterials.EndDataUpdate();

Save();

}

}

}


private void btnView_Click(object sender, System.Windows.RoutedEventArgs e)

{

if (grdInfoMaterials.View.SelectedRows.Count > 0)

{

ViewMaterial((InfoMaterial)grdInfoMaterials.GetFocusedRow());

}

}


private void ViewMaterial(InfoMaterial infoMaterial)

{

var imWindow = new InfoMaterialWindow(infoMaterial);

imWindow.ShowDialog();

//_dataManager.InfoMaterialRepository.InsertComments(infoMaterial);

Save();

}

}

}

InfoMaterialWindow.xaml


<Window x:Class="WpfRDB.InfoMaterialWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:dx="clr-namespace:DevExpress.Wpf.Utils.Themes;assembly=DevExpress.Wpf.Core.v9.3"

xmlns:dxe="http://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>

<DataTemplate x:Key="DetailCoreTemplate">

<Core:MeasurePixelSnapper>

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="4" />

<RowDefinition Height="Auto" />

<RowDefinition Height="4" />

Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="4" />

<ColumnDefinition Width="64"/>

<ColumnDefinition Width="12"/>

<ColumnDefinition Width="200*"/>

Grid.ColumnDefinitions>

<Border Grid.Column="1" Grid.Row="1" BorderBrush="Black" BorderThickness="1">



<Image Source="{Binding DataContext.BitmapSource}" Height="64" Width="64" Name="imgInfoMat" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Top"/>

Border>

<Grid Grid.Column="3" Grid.Row="1">

<Grid.RowDefinitions>

<RowDefinition Height="16"/>

<RowDefinition Height="2"/>

<RowDefinition/>

Grid.RowDefinitions>


<TextBlock Grid.Row="0" Text="{Binding DataContext.AddingDate, StringFormat='hh:mm dd/MM/yyyy'}" FontSize="10" Foreground="DarkGray" HorizontalAlignment="Left" Width="159" />

<Button HorizontalAlignment="Right" Name="btnDelete" Width="16" Height="16" VerticalContentAlignment="Center" Click="btnDelete_Click">

<Image ToolTip="Удалить комментарий">

<Image.Source>pack://application:,,,/Images/cross.pngImage.Source>

Image>

Button>


<TextBlock Grid.Row="2" Text="{Binding DataContext.Text}" TextWrapping="WrapWithOverflow" />

Grid>

Grid>

Core:MeasurePixelSnapper>

DataTemplate>

ResourceDictionary>

Window.Resources>

<Grid dx:ThemeManager.ThemeName="Office2007Blue" x:Name="grBase">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="4" />

<ColumnDefinition/>

<ColumnDefinition Width="4"/>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="24" />

<RowDefinition Height="7" />

<RowDefinition Height="128" />

<RowDefinition Height="4" />

<RowDefinition Height="250*" />

<RowDefinition Height="4" />

<RowDefinition Height="16" />

<RowDefinition Height="4" />

<RowDefinition Height="171*" />

<RowDefinition Height="4" />

<RowDefinition Height="140" />

<RowDefinition Height="4" />

<RowDefinition Height="28" />

<RowDefinition Height="4" />

Grid.RowDefinitions>

<TextBlock Grid.Column="1" Margin="0,0,8,2" Name="txtHeader" VerticalAlignment="Bottom" Text="{Binding Name}" FontSize="14" FontWeight="Bold" TextDecorations="None" />

<Border Grid.Column="1" Grid.Row="1" VerticalAlignment="Top" Height="1" BorderThickness="1" BorderBrush="Black">Border>

<Grid Grid.Row="2" Grid.Column="1">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="128"/>

<ColumnDefinition Width="4"/>

<ColumnDefinition Width="200*"/>



Grid.ColumnDefinitions>

<Border Grid.Column="0" BorderThickness="1" BorderBrush="Black">

<Image Width="128" HorizontalAlignment="Left" Name="imgPicture" Stretch="Fill" Source="{Binding BitmapSource}" />

Border>

<TextBlock Grid.Column="2" Name="txtAnnotation" TextWrapping="Wrap" Text="{Binding Annotation}" />

Grid>

<dxe:TextEdit Grid.Row="4" Grid.Column="1" Name="txtText" TextWrapping="WrapWithOverflow" VerticalContentAlignment="Top" Text="{Binding Text}" />


<TextBlock Grid.Row="6" Grid.Column="1" Text="Комментарии:" />


<dxg:GridControl Grid.Row="8" Grid.Column="1" Name="grdComments" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid">

<dxg:GridControl.Columns>

<dxg:GridColumn FieldName="Text" />

<dxg:GridColumn FieldName="AddingDate" />

dxg:GridControl.Columns>

<dxg:GridControl.View>

<dxg:TableView

Name="view" ShowGroupPanel="False" ShowColumnHeaders="False" NavigationStyle="Row" DataRowTemplate="{DynamicResource DetailCoreTemplate}" AutoWidth="True">

dxg:TableView>

dxg:GridControl.View>

dxg:GridControl>


<Grid Grid.Row="10" Grid.Column="1" x:Name="grAddComment">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="4"/>

<ColumnDefinition Width="200*"/>

<ColumnDefinition Width="4"/>

Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="18" />

<RowDefinition Height="4" />

<RowDefinition Height="24" />

<RowDefinition Height="4" />

<RowDefinition Height="40*" />

Grid.RowDefinitions>

<TextBlock Grid.Row="0" Grid.Column="1" Text="Добавить новый комментарий" FontSize="11" FontWeight="Bold" />

<TextBlock Grid.Row="2" Grid.Column="1" Text="Текст:" HorizontalAlignment="Left" VerticalAlignment="Center" Width="89" />

<Button Grid.Row="2" Grid.Column="1" Name="btnAddComment" HorizontalAlignment="Right" Width="71" Click="btnAddComment_Click" ToolTip="Добавить написанный комментарий">ДобавитьButton>

<dxe:TextEdit Grid.Row="4" Grid.Column="1" Name="txtComment" TextWrapping="WrapWithOverflow" VerticalContentAlignment="Top" />

Grid>

<Button Grid.Row="12" Grid.Column="1" HorizontalAlignment="Right" Name="btnOK" Width="71" Margin="0,2" Grid.RowSpan="2" Click="btnOK_Click">OKButton>

Grid>

Window>

InfoMaterialWindow.xaml.cs


using System;



using System.Collections.Generic;

using System.Windows;

using ASDC.Model.InfoMaterials;

namespace WpfRDB

{

///

/// Interaction logic for InfoMaterial.xaml

///


public partial class InfoMaterialWindow

{

private InfoMaterial _infoMaterial;


public InfoMaterialWindow()

{

InitializeComponent();

}


public InfoMaterialWindow(InfoMaterial infoMaterial) : this()

{

_infoMaterial = infoMaterial;

}


private void InitDataSources()

{

grBase.DataContext = _infoMaterial;

grdComments.DataSource = _infoMaterial.Comments;

grdComments.RefreshData();

}


private void Window_Loaded(object sender, RoutedEventArgs e)

{

InitDataSources();

}


private void btnAddComment_Click(object sender, RoutedEventArgs e)

{

var comment = new Comment {Text = txtComment.Text, AddingDate = DateTime.Now};

((ICollection<Comment>) grdComments.DataSource).Add(comment);

_infoMaterial.Comments.Add(comment);

}


private void btnOK_Click(object sender, RoutedEventArgs e)

{

Close();

}


private void btnDelete_Click(object sender, RoutedEventArgs e)

{

grdComments.BeginDataUpdate();

var comment = (Comment) grdComments.GetFocusedRow();

((ICollection<Comment>) grdComments.DataSource).Remove(comment);

grdComments.EndDataUpdate();

}

}

}

Convertor.cs


using System.Drawing;

using System.IO;



using System.Windows.Media.Imaging;

namespace ASDC.Model.Classes

{

public static class Convertor

{

public static byte[] ImageToByte(Image img)

{

var converter = new ImageConverter();

return img != null ? (byte[])converter.ConvertTo(img, typeof(byte[])) : null;

}


public static Image ByteToImage(byte[] bytes)

{

var converter = new ImageConverter();

return bytes != null ? (Image)converter.ConvertFrom(bytes) : null;

}


public static BitmapImage ByteToBitmapSource(byte[] bytes)

{

var img = ByteToImage(bytes);

return ImageToBitmapSource(img);

}


public static BitmapImage ImageToBitmapSource(Image img)

{

if (img == null)

return null;


var bi = new BitmapImage();

var ms = new MemoryStream();


bi.BeginInit();

img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

ms.Seek(0, SeekOrigin.Begin);

bi.StreamSource = ms;

bi.EndInit();


return bi;

}


public static Image BitmapSourceToImage(BitmapImage bs)

{

if ((bs == null) || (bs.StreamSource == null))

return null;


return new Bitmap(bs.StreamSource);

}


public static byte[] BitmapSourceToBytes(BitmapImage bs)

{

var bitmap = (Bitmap)BitmapSourceToImage(bs);

return ImageToByte(bitmap);

}

}

}

Filter.cs


using System;

namespace ASDC.Model.Classes

{

public enum SortDirectionType

{

Top = 0,

Low = 1

}
public class Filter

{

private string _name;

private bool _byRating;

private bool _byViewCount;

private int _numberOfRows;

private DateTime _dateFrom;

private DateTime _dateTo;

private SortDirectionType _sortDirection;


public string Name

{

get { return _name; }

set { _name = value; }

}


public bool ByRating

{

get { return _byRating; }

set { _byRating = value; }

}


public bool ByViewCount

{

get { return _byViewCount; }

set { _byViewCount = value; }

}


public int NumberOfRows

{

get { return _numberOfRows; }

set { _numberOfRows = value; }

}


public DateTime DateFrom

{

get { return _dateFrom; }

set { _dateFrom = value; }

}


public DateTime DateTo

{

get { return _dateTo; }

set { _dateTo = value; }

}


public SortDirectionType SortDirection

{

get { return _sortDirection; }

set { _sortDirection = value; }

}

}

}



Category.cs


using System.Collections.Generic;

using System.Drawing;

using System.Windows.Media.Imaging;

using ASDC.Model.Classes;

namespace ASDC.Model.InfoMaterials

{

public partial class Category

{

public Category Parent { get; set; }


public List<Category> Children { get; set; }


public Image Bitmap { get; set; }


private BitmapImage _bitmapSource;

public BitmapImage BitmapSource

{

get { return _bitmapSource; }

set

{

_bitmapSource = value;

Image = Convertor.BitmapSourceToBytes(_bitmapSource);

}

}

}

}

CategoryRepository.cs


using System.Collections.Generic;

using System.Linq;

using ASDC.Model.Classes;

namespace ASDC.Model.InfoMaterials

{

public class CategoryRepository

{

private ASDCEntities _entities;


///

/// Конструктор класса

///


///
Ссылка на объект-хранилище (коннекшен, connection), включающее все сущности (entities) промапленной (mapping) БД.


public CategoryRepository(ASDCEntities entities)

{

_entities = entities;

}


///

/// Функция выбирает категорию по заданному идентификатору (id)

///


///
Идентификатор категории, которую нужно выбрать


///

public Category GetCategory(long categoryId)

{

Category category = _entities.Categories.First(c => c.ID_Category == categoryId);



category.BitmapSource = Convertor.ByteToBitmapSource(category.Image);

return category;

}


///

/// Функция выбирает два уровня категорий

///


///

public List<Category> GetCategories()

{

var categories = GetSubCategories(0);


foreach (var category in categories)

{

category.Children = GetSubCategories(category.ID_Category);

}


return categories.ToList();

}


///

/// Функция рекурсивно выбирает все категории

///


///
Категория, подкатегории которой нужно выбрать


///

public List<Category> GetCategories(long categoryId)

{

var categories = GetSubCategories(categoryId);

if (categories != null)

{

foreach (var category in categories)

{

category.Children = GetCategories(category.ID_Category);

}

}

return categories;

}


///

/// Функция выбирает подкатегории заданной категории

///


///
Категория, подкатегории которой нужно выбрать


///

public List<Category> GetSubCategories(long categoryId)

{

var categories = (from c in _entities.Categories

where categoryId == 0 ? (c.ParentCategory == categoryId || c.ParentCategory == null) : (c.ParentCategory == categoryId)

select c).ToList();


foreach (var category in categories)

{

category.BitmapSource = Convertor.ByteToBitmapSource(category.Image);

}

return categories;

}


///

/// Функция добавления новой категории

///




///
Новая категория в виде класса категории


///

public Category InsertCategory(Category category)

{

_entities.AddToCategories(category);

return category;

}


public void DeleteCategory(Category category)

{

_entities.DeleteObject(category);

}


public void SaveChanges()

{

_entities.SaveChanges();

}

}

}

InfoMaterial.cs


using System.Windows.Media.Imaging;

using ASDC.Model.Classes;

namespace ASDC.Model.InfoMaterials

{

public partial class InfoMaterial

{

private BitmapImage _bitmapSource;

public BitmapImage BitmapSource

{

get { return _bitmapSource; }

set

{

_bitmapSource = value;

Image.Image = Convertor.BitmapSourceToBytes(_bitmapSource);

}

}

}

}

InfoMaterialRepository.cs


using System.Collections.Generic;

using System.Linq;

using ASDC.Model.Classes;

namespace ASDC.Model.InfoMaterials

{

public class InfoMaterialRepository

{

private ASDCEntities _entities;


public InfoMaterialRepository(ASDCEntities entities)

{

_entities = entities;

}


public List<InfoMaterial> GetInfoMaterialsByFilter(Filter filter)

{



var infoMaterials = from im in _entities.InfoMaterials.Include("Image")

where (im.PublishDate >= filter.DateFrom && im.PublishDate <= filter.DateTo)

select im;

if (filter.NumberOfRows <= 0)

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);

return ConvertInfoMaterialImageToBitmapSource(infoMaterials.ToList());

}


public List<InfoMaterial> GetShortInfoMaterialsByCategory(long categoryId)

{

var infoMaterials = (from im in _entities.InfoMaterials.Include("Image").Include("Comments")

where im.Category.ID_Category == categoryId

select im).ToList();

return ConvertInfoMaterialImageToBitmapSource(infoMaterials);

}


private List<InfoMaterial> ConvertInfoMaterialImageToBitmapSource(List<InfoMaterial> infoMaterials)

{

foreach (var infoMaterial in infoMaterials)

{

if (infoMaterial.Image != null)

infoMaterial.BitmapSource = Convertor.ByteToBitmapSource(infoMaterial.Image.Image);

}

return infoMaterials;

}


public InfoMaterial GetInfoMaterial(long materialId)

{

var infoMaterial = (from im in _entities.InfoMaterials.Include("Image").Include("Comments")

where im.ID_InfoMaterial == materialId

select im).First();

if (infoMaterial.Image != null)



infoMaterial.BitmapSource = Convertor.ByteToBitmapSource(infoMaterial.Image.Image);

return infoMaterial;

}
public InfoMaterial InsertInfoMaterial(InfoMaterial material)

{

_entities.AddToInfoMaterials(material);

if (material.Image != null)

_entities.AddToInfoMat_Image(material.Image);

return material;

}


public InfoMaterial InsertComments(InfoMaterial material)

{

foreach (var comment in material.Comments.ToList())

{

_entities.AddToComments(comment);

}
return material;

}


public void DeleteInfoMaterial(InfoMaterial material)

{

_entities.DeleteObject(material);

}


public void SaveChanges()

{

_entities.SaveChanges();

}

}

InfoMaterialsDataManager.cs


namespace ASDC.Model.InfoMaterials

{

public class InfoMaterialsDataManager

{

private ASDCEntities _entities;

private CategoryRepository _categoryRepository;

private InfoMaterialRepository _infoMaterialRepository;


public InfoMaterialsDataManager()

{

_entities = new ASDCEntities();

}


public CategoryRepository CategoryRepository

{

get

{

if (_categoryRepository == null)

_categoryRepository = new CategoryRepository(_entities);


return _categoryRepository;

}

}


public InfoMaterialRepository InfoMaterialRepository

{

get



{

if (_infoMaterialRepository == null)

_infoMaterialRepository = new InfoMaterialRepository(_entities);


return _infoMaterialRepository;

}

}

}

}

1. Реферат на тему The German-Great Britain Trade Rivalry In Comparison
2. Реферат на тему Juvenilly Jiolence Essay Research Paper Juvenile ViolenceChicago
3. Реферат на тему Unjust People Rectification Essay Research Paper Robert
4. Реферат Особенности судебного порядка рассмотрения индивидуальных трудовых споров
5. Реферат на тему Что такое язык программирования
6. Реферат на тему Spree In The Bridal Chamber Essay Research
7. Контрольная работа Принципы задачи и морально-этнические основы оперативно-розыскной деятельности
8. Реферат Морозов, Павел Егорович
9. Биография на тему Отец информатики и первый хакер Алан Тьюринг
10. Реферат Управления инвестиционными процессами на предприятии