dev.net.ua

Українська Спільнота Розробникiв
 
Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

Андрей

В WPF появился DataGrid

Приятный сюрприз после отпуска, с выходом NET 3.5 SP1 появилась возможность использовать WPF-ный DataGrid.

Насколько мне известно, Выход SP1 состоялся 11 августа, а 12-го выложили WPFToolkit.dll, правда ещё только CTP. Но MS божится, что скоро будет окончательный релиз.

Сегодня оторвался от дел, нетерпелось пощупать долгожданный всеми контрол. Времени было немного, но в основном я остался доволен.

Далее приводится короткое описание использования  этого контрола полученное мною методом тыка Smile.

1. Скачиваем DLL.
2. Разархивируем и суём куда-нибудь.
3. Создаем тестовое WPF приложение (обязательно SP1).
4. В Solution Explorer -> References добавляем ссылку на либу.
5. Создаём источник для DataGrid:

public class MyClass
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}

public class MyClasses : System.Collections.ObjectModel.ObservableCollection<MyClass>
{
}

6. Создаём простенькую разметку:

<Window x:Class="WpfApplicationSP1test.Window1"
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:l="clr-namespace:WpfApplicationSP1test"
xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
Title="Тестовое приложение SP1" Height="275" Width="474" WindowStartupLocation="CenterScreen" Name="window1">
 <Window.Resources>
  <l:MyClasses x:Key="dgSource"/>
 </Window.Resources>
 <DockPanel>
  <ToolBar DockPanel.Dock="Top">
   <Button Name="Load" Content="Загрузить" Click="Load_Click"/>
   <Button Name="Save" Content="‘Сохранить" Click="Save_Click"/>
   <Separator Margin="4,0,4,0"/>
   <Button Name="Add" Content="Добавить" Click="Add_Click"/>
  </ToolBar>
 
<dg:DataGrid DockPanel.Dock="Top" Name="dataGrid" DataContext="{DynamicResource dgSource}" ItemsSource="{Binding}" AutoGenerateColumns="True"/>
 </DockPanel>
</
Window>

7. Пишем обработчики событий в отделённом коде:

private void Load_Click(object sender, RoutedEventArgs e)
{
 
var fs = new System.IO.FileStream("dgSource.XAML", System.IO.FileMode.Open);
 
var dgSource = System.Windows.Markup.XamlReader.Load(fs) as MyClasses;
 
if (dgSource == null) return;
 window1.Resources.Remove(
"dgSource");
 window1.Resources.Add(
"dgSource", dgSource);
}

private void Save_Click(object sender, RoutedEventArgs e)
{
 var dgSource = window1.FindResource("dgSource") as MyClasses;
 if (dgSource == null) return;
 var fs = new System.IO.FileStream("dgSource.XAML", System.IO.FileMode.Create);
 System.Windows.Markup.
XamlWriter.Save(dgSource, fs);
 fs.Close();
}

private void Add_Click(object sender, RoutedEventArgs e)
{
 var dgSource = dataGrid.ItemsSource as MyClasses;
 if (dgSource == null) return;
 dgSource.Add(
new MyClass());
}

8. Компилируем и запускаем на выполнение.

Что понравилось:
1. С источниками данных работает также, как и ListBox (может быть есть и другие варианты, пока ещё не смотрел).
2. Без лишних телодвижений работает сортировка столбцов (в том числе и по нескольким столбцам при нажатом Shift).
3. Нормально работает прямой и обратный (на источник) биндинг, поэтому легко управлять данными, манипулируя непосредственно источником. Не требуются всякие там AcceptText...

Не понравилось:
Удаление строк клавишей <Del>. По моему мнению это не очень удобно и может привести к путанице при редактировании ячеек. К примеру, пользователь при вводе данных ошибся, при помощи <Del> что-то удалил, нажал <Enter>, а потом решил что-то доудалить и ещё раз нажал <Del>, после чего исчезнет вся редактируемая строка. Надеюсь, что это можно как-то переопределить, попробую поколдовать с туннелированными событиями.

Но в целом впечатление очень даже приятное, планирую в ближайшее время серьёзно заняться изучением этого контрола. Если сообщество проявит интерес, кое-что могу запостить и сюда.

PS. Если хотите проинициализировать столбцы вручную, нужно перевести AutoGenerateColumns="False" и прописать:

<dg:DataGrid DockPanel.Dock="Top" Name="dataGrid" DataContext="{DynamicResource dgSource}" ItemsSource="{Binding}" AutoGenerateColumns="False">
 <dg:DataGrid.Columns>
  <dg:DataGridTextColumn Header="Первое поле" DataFieldBinding="{Binding Field1}"/>
  <dg:DataGridTextColumn Header="Второе поле" DataFieldBinding="{Binding Field2}"/>
  <dg:DataGridTextColumn Header="Третье поле" DataFieldBinding="{Binding Field3}"/>
 </dg:DataGrid.Columns>
</dg:DataGrid>

 

PS. Внимание всем, кто до сих пор просматривает этот блог!

Вышел октябрьский релиз WPFToolkit. В отличие от CTP, релиз инсталлируется через MSI. После инсталляции в тулбоксе VS 2008 SP1 появляется вкладка WPF Toolkit.

Опубліковані Wednesday, September 03, 2008 2:51 PM від ServiceDeveloper
Помічено як:

Коментарі

 

Mike Chaliy сказав:

По-перше я знав про те що WPF Grid існує, а по друге я знав що ви про нього писали, отже мої дії

- зрозуміти що мені потрібен ДатаГрід.

- піти на дев.нет.уа

- знайти цей пост

- закчати тукіт

- вставити код прикладу

- скомпілювати проект...

;)

September 5, 2008 6:31 AM
 

WPF DataGrid « Konstantin’s сказав:

October 24, 2008 11:36 AM
 

ServiceDeveloper сказав:

>WPF DataGrid « Konstantin’s сказал:

>Пінгбек від http://nix0.wordpress.com/2008/10/24/wpf-datagrid/

Рекомендую ещё обратить внимание на такой замечательный продукт, как NetAdvantage for WPF. Есть бесплатная Express версия, там только DataGrid.

PS. Кстати, недавно приходилось использовать в качестве источника WPF-ного датагрида DataTable, который заполнялся ODBC адаптером. Всё прекрасно сочетается. Так что ограничений на использование БД быть не должно. Желаю успехов в разработке Вашего проекта.

October 26, 2008 11:10 PM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.