ダイハツ情報
ダイハツを各種ブログ(Blog)から一括検索します。
トップ > 1434 > 1434 - 人気ブログ(Blog)検索結果詳細 (2009年1月8日 11時)
【WPF】縞々ブラシを作ろうよ!

Source and Project
お客様、かわいい外観のアプリケーションをご要望との事ですが、当社ではそのようなアプリケーションを扱っておりません(本当はスキルがないだけーなんですがー)
というのは冗談ですが、今回はちょっとかわいらしいBrushを作成してみようとおもいます。これでバレンタインデーもバッチリですね!
まず、Expression Blend 2でWPFアプリケーションのソリューションを開きます。Expression Blend 2なしでも作れるように解説しますので、ご安心を

Window.BackgroundプロパティでとりあえずサンプルBrushを作成することにします。デザインのWindowをクリックすればプロパティタブがWindowsのプロパティになります。

Backgroundプロパティを選択下状態でグラデーションを選択します。

これでデザインがグラデーションになっていることが確認できます。

次にツールバーから「ブラシの変更」を選択します。

デザイン上に矢印が現れた事が確認できると思います。

さて、この矢印を出来るだけ短くしてください。矢の先の部分をShiftを押しながらドラッグすると、うまく出来ると思います。また、画面を拡大したり、直接XAMLを書くというのもありです。今回はかなり適当に下記のような感じになっています。

さてさて、これから二つのプロパティを変更すうことでグラデーションが縞々模様になります。下記の画面の通り、プロパティタブ > ブラシ > オブションを選択します。オプションないのRepeatプロパティとAbsoluteプロパティにチェックを入れます。


で、デザイン上のWindowを見てみます。縞々になっていることが確認でいますね。ただ幅が狭かったようです。

微調整してみましょう。矢印を広げるだけですが、よく見てやりましょう。

目がちかちかしますが、これは白と黒の縞々だからです。目に優しくかわいらしい色にしましょう。色はパステル調で控えめな感じにすると全体の調子が整うはずです。
ちょといたポイントを解説すると、下の図の丸がある位置にポイントを固定して、サイドのある色を変えてみてください。グレー系のパステル調になるはずです。

絵の具でいうとパステル調とは減色に白がを混ぜた状態です。
では、Windowを見てみましょう。

まあ、好みの問題なのでこれが良いとか悪いとか、最終的には個人に依存します。
実行してみます。

Windowを広げてみます。

縞々のサイズは変更されませんね。良い感じです。
実はプロパティをきちんと設定しないと一見うまく動いているとうに見えて、問題のあるパターンもあります。
それは先ほどのプロパティタブ > ブラシ > オブションからBoundingBoxを選択した場合です。

XAMLではMappingMode="RelativeToBoundingBox"とは未指定の場合、その設定になります。
<LinearGradientBrush ... MappingMode="RelativeToBoundingBox">
...
</LinearGradientBrush>
では実際に動かしてみます。


とまあ、拡大すると縞々まで拡大されるのでMappingModeプロパティはAbsoluteにしましょう。
と言うことでこの生成したXAMLを再利用すれば、Blendを使わなくても縞々が実装できますね。
はい。
<LinearGradientBrush EndPoint="90,46.8"
StartPoint="90,42"
SpreadMethod="Repeat"
MappingMode="Absolute" >
<GradientStop Color="#FFA3A892" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
では、まとめます。
1.縞々模様はLinearGradientBrushで実現可能。
2.EndPointとStartPointをなるべく近い位置にします(近すぎるとチカチカします。)
3.LinearGradientBrush.SpreadMethodプロパティを"Repeat"にし、
LinearGradientBrush.MappingModeプロパティを"Absolute"にします。
4.グラデーションは控えめな色を指定するとパステル調なかわいい縞々になります。
以上
Source and Project
作者:art55
更新日:2009年1月9日 0時49分
【WPF】DataTable - DataView - BindingListCollectionView

Source and Project
DataTable - DataView - BindingListCollectionViewで遊んでみました。
class Program
{
static void Main(string[] args)
{
var table = new DataTable("TEST_TABLE");
table.Columns.Add("COLUMN01");
table.Columns.Add("COLUMN02");
table.Columns.Add("COLUMN03");
table.Columns.Add("COLUMN04");
table.Columns.Add("COLUMN05");
for (int i = 0; i < 10; i++)
table.Rows.Add(new object[] { "A0" + i, "B0" + i, "C0" + i, "D0" + i, "E0" + i });
var collectionView = new BindingListCollectionView(table.DefaultView);
if (collectionView.CanCustomFilter)
{
// ItemCollectionを使って、元のデータソースを意識せずにFilter処理をしたい場合
collectionView.CustomFilter = "COLUMN01='A01'";
}
ShowView(collectionView);
// もちろん今回の処理をBindingListCollectionViewプロクシなんて使う必要はなく。
var dataView1 = new DataView { Table = table, RowFilter = "COLUMN01='A03'" };
ShowView(collectionView);
ShowView(dataView1);
IBindingListView dataView2 = new DataView { Table = table };
dataView2.Filter = "COLUMN01='A05'";
ShowView(dataView2);
}
private static void ShowView(IEnumerable collectionView)
{
foreach (DataRowView item in collectionView)
{
foreach (DataColumn dataColumn in item.Row.Table.Columns)
Console.Write("{0} ", item[dataColumn.ColumnName]);
Console.WriteLine();
}
Console.WriteLine();
}
}
この実行結果は
------------------------------------
A01 B01 C01 D01 E01
A01 B01 C01 D01 E01
A03 B03 C03 D03 E03
A05 B05 C05 D05 E05
となります。
---------------------------------
ちょっとだけ解説。
var collectionView = new BindingListCollectionView(table.DefaultView);
これはDataTableのデフォルトのDataViewからBindingListCollectionViewを生成しています。BindingListCollectionViewのコンストラクタはIBindingListViewを引数とするコンストラクタが実装されています。これでCollectionViewオブジェクトが得られる訳です。
さて、BindingListCollectionView.CustomFilterプロパティはフィルタを設定または取得するプロパティですが、これをMSDNでみると・・・
BindingListCollectionView.CustomFilter プロパティ
ええと、どういう風に設定するば良いのかサッパリわかりませんね。包含しているIBindingListViewのFilterプロパティに中継すると思われますので、ソースをのぞくと、やっぱりIBindingListView.FilterプロパティにBindingListCollectionView.CustomFilterで設定された値が設定されていました。ではIBindingListView.Filter プロパティをMSDNライブラリーを見ると
IBindingListView.Filter プロパティ
これまた設定方法がわかりせん。と言うことでIBindingListViewの実装であるDataViewをのぞくと
IBindingListView.Filter は DataView.RowFilter と値を参照する形になっていました。と言うことでDataView.RowFilterの設定方法は
DataView.RowFilter プロパティ
ええ。ようやく設定方法がわかりました。
RowFilter 値を作成するには、列名の後に演算子とフィルタ処理をする値を付けて指定します。値は引用符で囲む必要があります。
例 :
"LastName = 'Smith'"
詳細については、DataColumn クラスの Expression プロパティのトピックを参照してください。
null 値が格納されている列だけを返すには、次の式を使用します。
"Isnull(Col1,'Null Column') = 'Null Column'"
これはDataTable.Select()メソッドと同じ設定のようです。と言うことで、今回のサンプルコードはDataViewをそれぞれ作り、
BindingListCollectionView.CustomFilterプロパティ
IBindingListView.Filterプロパティ
DataView.RowFilterプロパティ
にフィルター処理を行ってDataViewのコレクションを表示するコードを書いてみたわけです。
結論は
BindingListCollectionView.CustomFilterプロパティ
IBindingListView.Filterプロパティ
DataView.RowFilterプロパティ
どれを使ってもDataView.RowFilterプロパティに値が設定されフィルター処理が実行されます。
ただし、BindingListCollectionViewとIBindingListViewは状況によって利用するのかしっかりと理解する必要があると感じます。と言うことで今回はこれで終わり。
まとめます。
1.DataViewはDataTableを生成時にDataViewが
一つフィールドにもちDefaultViewプロパティで公開されている。
2.DataViewはコンストラクタを呼び出すことで
DataTable.DefaultViewは別インスタンスを生成可能である。
3.BindingListCollectionViewのコンストラクタは
public BindingListCollectionView(IBindingList list);
だけである。そのため必ずBindingListCollectionViewオブジェクトは
IBindingListオブジェクトを包含し、これがいわゆるデータソースとなる。
4.DataViewをソースとしてBindingListCollectionViewを生成した場合の
各フィルターの設定は、どこから設定してもDataViewないの
(行)フィルターとして使用される。
※書式はstring型なのでジェネレータなどを作成したり出来ればベストかな?
5.BindingListCollectionView、IBindingListView、DataViewは適材適所で使用する。または使用しない。
ちなみにその判断は、ただいま勉強中です(笑)
ちょっと小話。
Linqが出てくる以前は私はDataViewを使用することがほとんどありませんでした。それはDataRowViewからDataRow、DataRowからDataRowViewを特定する機構を実装するのが、結構面倒な状況にあったからです(DataTable.PrimaryKey)が設定されていないばあいなどがそれです。しかし、Linqが出てきてそれが劇的に改善され感動したことを覚えています。Linqスゴー。
Source and Project
作者:art55
更新日:2009年1月9日 0時18分
【WPF】ItemsControl.ItemsSourceからItemsControl.Itemsまで

WPFに限った話ですが、ItemsControl.DataContextにDataTableを代入して、ItemsControl.DataContext(object型)をデータソースとしてItemsControl.ItemsSourceをターゲットとするBindingを実現すると、ItemsControl.ItemsSourceにDataViewが送信されます。さらに、このItemsControl.ItemsSourceからItemsControl.Items(ItemsCollection型)というコレクションの各アイテムのDataRowViewが詰まった状態になります。
この振る舞いに私は以前、面食らった覚えがあり、そのときのスキルをフル活用して調べてみたのですが、振る舞いに関係するクラスはピックアップ出来たもののその関係がよくわからず、投げ出してしまいました。
先月、マイクロソフトのセミナーで仕入れたIEditableCollectionViewと、MSDNライブラリー(古いバージョン)の不整合を見つけ追い回しているうちに、クラスの相関みえてきたので、クラス同士に関係をひっぱってみました。
ItemsControl.ItemsSourceからItemsControl.Itemsへの振る舞いに対する見通しがよくなってきたのでとりあえず公開します。
--------------------------------------
お・・・オブジェクト図の方がわかりやすかった・・・。
作者:art55
更新日:2009年1月8日 23時17分
【Windows 7】Windows 7 Beta (7000-0-081212-1400) Ultimate
https://connect.microsoft.com/Downloads/DownloadDetails.aspx?SiteID=704&DownloadID=15861&wa=wsignin1.0
Windows 7 betaがリリースされました!何か日本語版もあるようなので早速ダウンロード。
作者:art55
更新日:2009年1月8日 21時23分
【WPF/Silverlight】WPF/Silverlightセミナー情報
Visual Studio 2008 ではじめる WPF プログラミング
〜はじめての User Experience 〜
http://www.microsoft.com/japan/mscorp/mic/seminar/hrd_wpf.mspx
http://www.microsoft.com/japan/mscorp/mic/seminar/hrd_wpf.mspx
Silverlight 2 プログラミング 〜はじめての RIA 開発〜
http://www.microsoft.com/japan/mscorp/mic/seminar/silverlight2.mspx
2009 年 1 月 20 日 火曜日 10:00 ~ 17:30 (9:30 受付開始)
超おすすめです。
作者:art55
更新日:2009年1月8日 21時21分
【WPF】BindingListCollectionViewクラスの継承関係。

BindingListCollectionViewクラスとその継承関係を調べていたのですが、どうもよくわかりません。MSDNなどを見る限り、BindingListCollectionViewクラスは
public sealed class BindingListCollectionView :
CollectionView, IComparer
となっているようなのですが、実際にBindingListCollectionViewクラスのオブジェクトは
IEditableCollectionViewインターフェイスやIItemPropertiesインターフェイsがキャスト可能です。CollectionViewにもそのようなインターフェイスは継承されておらず、これはどういう事なのだと・・・。微妙に.NET Frameworkのバージョン違うのでしょうか・・・。
公開されているコード、MSDNライブラリー、オブジェクトブラウザを見る限りは、継承しているように見えないのですが・・・実際に実行時はキャストが可能です。さらにReflectorでのぞいてみると、IEditableCollectionViewとIItemPropertiesをBindingListCollectionViewクラスが継承していることが確認できました。partialを使って、どこか別に場所に定義されているのかなぁ〜なんて想像してみたのですが、確かめる手段が思いつかないので・・・ええ。
と言うことで
BindingListCollectionViewクラス周りのクラス図を作ってみました。間違っていたらごめんなさい。

public interface IItemProperties
{
// Properties
ReadOnlyCollection
}
public interface IEditableCollectionView
{
object AddNew();
void CancelEdit();
void CancelNew();
void CommitEdit();
void CommitNew();
void EditItem(object item);
void Remove(object item);
void RemoveAt(int index);
bool CanAddNew { get; }
bool CanCancelEdit { get; }
bool CanRemove { get; }
object CurrentAddItem { get; }
object CurrentEditItem { get; }
bool IsAddingNew { get; }
bool IsEditingItem { get; }
NewItemPlaceholderPosition NewItemPlaceholderPosition { get; set; }
}
IItemPropertiesやIEditableCollectionViewはこのBlogで公開しているサンプルコードで何度か書いた記憶があるのですが、たしか・・・IItemPropertiesは誰が継承しているんだって前も疑問に思った事があるのですが、きちんと調べていなかった事を今更ながらに思い出しました。そうかそうか・・・でも、わかんねー。
とりあえず今回はメモ書き程度の情報です。ごめんなさいね。
----------------
追記)
IEditableCollectionViewは.NET Framework 3.0 SP1から追加されたインターフェイスなので、おそらく見ていたドキュメントやソースが古かった為、このような不整合が起こったものと考えられます。確証を得てませんが、おそらくそういうことだと思います。
----------------
追記2)
MSDN Library for Visual Studio 2008 SP1 (2008年12月更新版)
これをインストールすればいいのかしら・・・。
-----------------
追記3)
昨日書いた絵はインターフェイスから伸びる線の三角印の絵が間違って増した。
作者:art55
更新日:2009年1月7日 23時9分
【Silverlight】Silverlightアプリでアニメーションを効率よく使うテクニック
◆Silverlightアプリでアニメーションを効率よく使うテクニック
プログラマや業務システムの担当者にアニメーションの話をすると、うちのシステ
ムには必要ないといった感じの答えが返ってきます。確かに業務アプリケーション
とアニメーションは無縁のように感じますが、待ってください、これは本当でしょ
うか? 今回は、Silverlight 2を使って、業務アプリケーションでアニメーション
を効率よく使うためにはどうしたらよいのかを考えていこうと思います。
http://wb.pbz.jp/r01/Je2DiueDpQ9v4V4Qi4y2OA/mNqgVZLn50UXZVgXZtCU0A/
引用元 CodeZine News 2009-01-07
◆Silverlight 2で大きく変わったコントロール
本連載は、業務アプリケーションにおいてSilverlight 2をどのように活用できる
かという観点で進めています。Silverlight 2は開発者から見ると.NET Framewor
kのサブセット的な位置づけにあり、.NET環境でよく使われる数々のコントロール
がサポートされています。今回はサンプルを通していくつかの代表的なコントロー
ルを取り上げ、その使い方を解説します。
http://wb.pbz.jp/r01/2S2G4iBh764XroJ.qtBf0A/mNqgVZLn50UXZVgXZtCU0A/
引用元 CodeZine News 2009-01-07
CodeZineの記事がおもしろかったので紹介させていただきます。
作者:art55
更新日:2009年1月7日 20時59分
【仮想環境】先着 1000 名様「理想のデスクトップ環境 DVD」をプレゼント
★☆先着 1000 名様「理想のデスクトップ環境 DVD」をプレゼント!☆★
プレゼントは、以下の製品評価版 CD または DVD をセットでご提供。
・Windows Server 2008 ・System Center Virtual Machine Manager 2008
・Microsoft Desktop Optimization Pack ・Citrix XenDesktop
http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=11122043&s1=3b852b55-038a-3860-9a80-9eef1e4f9419
理想のデスクトップ環境 DVD(評価版)のプレゼントみたいですっ!
タダならもらうがポリシーの私はすぐに飛びつかせて頂きましたっ!
そんな事をしているのでVista Ultimate 評価版1年間が2枚家に転がってます・・・。
Visual Studio 2008 Standardが数枚家に転がってたりします(笑)
貰えるものは
・Windows Server 2008
・System Center Virtual Machine Manager 2008
・Microsoft Desktop Optimization Pack
・Citrix XenDesktop
みたいです!期間限定の評価版だと思いますが、開いているPCに試したいとか、暇なときにでもさわりたいとか、ちょっとでも心惹かれルところがあれば、応募してみては如何でしょうか?テクノロジーは触らないと絶対得られませんからっ!
Hyper-V上でWindows7を動かしているのですが、やっぱりHyper-Vは良いですねーサクサクですよ。
作者:art55
更新日:2009年1月7日 20時53分
【Book】インタラクションデザインの極意

About Face 3 インタラクションデザインの極意
Alan Cooper,Robert Reimann,David Cronin,長尾 高弘
最近、読んでいる本です。内容はAmazonなどでご確認ください(ひでー)
作者:art55
更新日:2009年1月7日 20時46分
【Silverlight】Silverlightを囲む会 in大阪#7があるそうです。
IT 勉強会カレンダー に記載されていて、気になっていたのですが、Silverlightを囲む会 と言うのが大阪で開催されるらしいです。さすがに大阪まで行くことは出来ませんが、きになります。
Yuya Yamaki’s blogに書かれていたのですがYamakiさんもセッションを開くそうです。
------------------------------------------------
★Silverlightを囲む会 in大阪#7
日時:2009/1/24(土)
1:30p.m〜5:00p.m ( 3時間半 )
------------------------------------------------
う〜ん、大阪は遠いですね。
作者:art55
更新日:2009年1月7日 0時44分
【WPF】BindingListCollectionViewを使ってグループ化。

Source and Project
【WPF】DataGrid + DataViewで行の状態を切り替えるて表示。で宣言したとおり、BindingListCollectionViewを利用してGroup化するアプリケーションをい作成してみようと思います。今回もDataGridを利用しますが、ListBoxでもListViewでもTabControlでも可能です。ItemsControlを継承しているコントロールであれば、実現可能です。ただし、データのソースとなるのはDataViewというのは必須です。
具体的にどういうアプリケーションを作成するか説明します。DataGridを利用するアプリケーションですが、DataGridはセル単位で値が変更可能です。また、デフォルトの設定では最下位の行が追加行となっており、値を挿入することで行も追加可能です。DataGridにDataTaleをソースとしてバインドします。これによりDataTable中のDataRowが変更・追加(削除も)可能になり、さまざまなDataRowStateを持つことができます。今回は各DataRowStateを単位とするグループを作成し、BindingListCollectionViewをプロキシとしてDataGrid上の表示をGroup表示するアクションを作成しようと思います。
(だらだら書いてごめんなさい)
では早速XAMLです。
<Window x:Class="Art55.DataGridDataViewDemo20090106_001.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnLoaded"
Title="Window1" Height="400" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:Data="clr-namespace:System.Data;assembly=System.Data">
<Window.Resources>
<Style x:Key="groupItemStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="True" Header="{Binding Path=Name}">
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<my:DataGrid x:Name="dataGrid1" ItemsSource="{Binding}" />
<Button Click="OnAction" Grid.Row="1" Margin="0,2,0,2">Not Grouping</Button>
</Grid>
</Window>
リソースはコード上で利用します。Group表示中のStyleとして使用しています。ButtonのClickイベントでGroup表示の切り替えをおこないます。ではコードを紹介します。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
var table = new DataTable();
table.Columns.Add("カラム1");
table.Columns.Add("カラム2");
table.Columns.Add("カラム3");
table.Columns.Add("カラム4");
for (int i = 0; i < 5; i++)
table.Rows.Add(new object[] { "A0" + i, "B0" + i, "C0" + i, "D0" + i });
table.AcceptChanges();
table.DefaultView.RowStateFilter = DataViewRowState.CurrentRows;
dataGrid1.DataContext = table;
}
private bool isGrouping;
private void OnAction(object sender, RoutedEventArgs e)
{
isGrouping = !isGrouping;
var collection = (BindingListCollectionView) CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
if (isGrouping)
{
dataGrid1.GroupStyle.Add(GetGroupStyle());
var droupDescription = new PropertyGroupDescription {PropertyName = "Row.RowState"};
collection.GroupDescriptions.Add(droupDescription);
((Button) sender).Content = "Grouping";
}
else
{
collection.GroupDescriptions.Clear();
dataGrid1.GroupStyle.Clear();
((Button)sender).Content = "Not Grouping";
}
}
private GroupStyle GetGroupStyle()
{
return new GroupStyle
{
ContainerStyle = ((Style) this.Resources["groupItemStyle"])
};
}
}
以前(【WPF】CollectionViewSourceでソートとグループ化)、XAMLでGroupDescriptionsをしているサンプルコードを紹介しましたが、今回はC#のコードでそれを実装しています。XAMLでかけるものはたいていコードでもかけますね(Silverlightでは一部ではかけないモノがあるようですが)今回のポイントは
var collection = (BindingListCollectionView) CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
に限ります。ItemsControl.ItemsSourceがどのような型(型によって返される値が変わると言うところまでは調べがついているのですが)であれば、どのような値が帰ってくるのか調べたいのですが、コードを読むだけでは、よくわからず、実行時にしらべるか、実際にいろいろ入れてみて確かめるしかなさそうです。これも機会があれば確かめて見ようと思っています。
話がそれましたが、では実際に実行してみます。初期状態は下記のような表示になります。

とりあえずGroup化してみます。下記の図をみるかぎりDataRowの状態は全てUnChangedとなっていることがわかります。

では編集してみましょう。"B02"を"Edit B02"に変更してみます。

編集モードが終了後、直ちにModifiedのグループが作成され、編集した行がそのグループに表示されることが確認できます。

次は行を追加してみます。最下位の行が新規の行なのでそこに値を記述してみます。

これも編集モードが終了後に直ちにAddedというグループが作成され、そこに追加した行が表示されていることが確認できます。

最後にGroup表示を解除してみます。

みたまんまですね。
では、まとめます。
1.CollectionViewSource.GetDefaultView()メソッドで
ItemsControl.ItemsSourceにセットされているコレクションを
ソースとするICollectionViewオブジェクトを取得できる。
2.DataViewをソースとするICollectionViewのオブジェクトは
BindingListCollectionViewである。
3.ICollectionViewを使用することでソースのオブジェクトを
変更することなく、Group化やソートなどが実行可能である。
4.Group表示に使われるStyleはItemsControl.GropuStyleから設定できる。
以上。
Source and Project
作者:art55
更新日:2009年1月7日 0時24分
【WPF】DataGrid + DataViewで行の状態を切り替えるて表示。

Source and Project
おなじみListBox系の記事を投稿します。
今回はDataGridとDataTable(DataView)を使用して
変更前の値と変更後の値をDataGrid上で表示切り替えする方法を紹介したいと思います。今回の話はWPFといよりは、むしろADO.NETの特にエンタープライズの友、DataSet, DataTable, DataRow, DataViewManagr, DataView, DataViewRowなどの知識が必要です。
ちなみにViewとModelの関係は
DataSet - DataViewManager
DataTable - DataView
DataRow - DataViewRow
となっています。
今回、作るアプリケーションは、変更可能なDataGridを配置し、値を変更し変更行がある状態で、元の値と現在の値を切り替えるというアプリケーションを作成します。
では、XAMLから紹介です。
<Window x:Class="Art55.DataGridDataViewDemo20090106_001.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnLoaded"
Title="Window1" Height="300" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:Data="clr-namespace:System.Data;assembly=System.Data">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<my:DataGrid x:Name="dataGrid1" ItemsSource="{Binding}"/>
<Button Click="OnAction" Grid.Row="1" Margin="0,2,0,2">Original</Button>
</Grid>
</Window>
OnLoadedメソッドでDataGrid.ItemSourceにDataViewをセットし、OnActionメソッドでカレントとオリジナルを切り替えます。実装は下記の通りです。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
var table = new DataTable();
table.Columns.Add("カラム1");
table.Columns.Add("カラム2");
table.Columns.Add("カラム3");
table.Columns.Add("カラム4");
for (int i = 0; i < 20; i++)
table.Rows.Add(new object[] { "A0" + i, "B0" + i, "C0" + i, "D0" + i });
table.AcceptChanges();
table.DefaultView.RowStateFilter = DataViewRowState.CurrentRows;
dataGrid1.DataContext = table;
}
private void OnAction(object sender, RoutedEventArgs e)
{
var button = (Button) sender;
var dataView = (DataView)dataGrid1.ItemsSource;
if (button.Content.Equals(ORIGINAL))
{
button.Content = CURRENT;
dataView.RowStateFilter = DataViewRowState.CurrentRows;
}
else
{
button.Content = ORIGINAL;
dataView.RowStateFilter = DataViewRowState.OriginalRows;
}
}
private const string ORIGINAL = "Original";
private const string CURRENT = "Current";
}
データソースとなるDataTableをAcceptChanges()しておかないと、状態が全てAddedになっているので、これを忘れてると意味不明な結果になります。では実際に動かしてみます。
下記が初期状態です。カレント行を表示するようにしています。

この時にオリジナルの値を表示するようにしても、当然、カレントと同じなので、変化はありません。

では、次に値を変更してみます。"B02"が"Edit B02"に変更された事がわかると思います。DataGridを使用されたことがない方の為に変更方法を紹介すると、変更したいセルの2回クリック(ダブルクリックとは微妙に違う)すれば、編集モードになるので、思い通りの値に変更してみてください。

では、オリジナルの値に表示を切り替えてみましょう。元の値が表示されていることがわかります。

今回の機構はDataViewのフィルター処理を利用しています。なので実際には特定の行だけを表示したりすることも可能です。たとえば変更を加えた行だけ表示するとか、追加した行だけを表示するといった事が実現可能です。
今回のコードでは
dataView.RowStateFilter = DataViewRowState.CurrentRows;
と
dataView.RowStateFilter = DataViewRowState.OriginalRows;
がそのフィルターの設定です。DataViewRowStateは、|演算子などのビット演算が可能ですが、DataViewRowState.CurrentRowsとDataViewRowState.OriginalRowsを同時に出す。というような矛盾した内容はRowStateFilterが受け付けず例外が発生するので注意が必要です。
ということで、今回はDataTableが持つViewを利用して、フィルター処理を紹介してみました。また、機会(【WPF】BindingListCollectionViewを使ってグループ化。)があれば、
CollectionViewSource.GetDefaultView()メソッドを使ってDataViewをソースとするICollectionViewの操作してソートやグループ化を実装してみようと思います。今回のコードからGetDefaultViewを得ると、BindingListCollectionViewというICollectionViewのオブジェクトが得られるはずです。
では、まとめます。
1.DataTableはDataViewというViewを包含している。
DataSet - DataViewManager
DataTable - DataView
DataRow - DataViewRow
と対応する。
2.Viewを使用することでDataTableの下記の処理が実行可能である。
並べ替え・フィルタ処理・検索・編集・移動
以上
Source and Project
作者:art55
更新日:2009年1月6日 22時19分
【雑記】プログラマになって2年たちました。
単なる雑記です。
---------------------------------------------------
プログラマになってちょうど2年の月日がたちました。それ以前は、ネットワークやサーバの構築・運用そして監視と言った業務を遂行するSEでした。SEの仕事は確か2年間やったと思います。後、私、あまり体が丈夫でなく色々と持病がありまして、バセドウ病という病気とそれに伴う周期性四肢麻痺と、WPW症候群という先天的な心臓の病気をもってまして、このおかげで実際に会社にいても全く仕事ができない時期もありまして、まあなんだかんだと今となっております。
どうも私には病気自慢癖があるようで、リビドー(それはリビドーではない)のおもむくままに書きますと、バセドウ病は放射能を口から摂取して甲状腺という臓器を破壊するという荒療治(放射線治療)によって、バセドウ病に伴う諸症状は出なくなりました。周期性四肢麻痺は、糖質や糖分を大量に摂取したり極度に運動したりすると、翌日ないし数日後に体が(脱力)麻痺して立ちあることはおろか、起き上がる事すらできなくなる状態が、半日くらい続く症状なのですが、これはどうやら私の生まれもっての体質なようで、バセドウ病が治まった今でも、たまに症状が出て困っています。WPW症候群は、心臓に余計な神経がつながって、突然、脈が2倍になるというファンキーな病気で、発作が起きなければ、起きないで一生過ごすことができる病気なのですが、私はバセドウ病のおかげで、発作が出るようになり、医者にカテーテル治療すれば簡単に治るよと言われつつもビビリなので実行に移せずにいます。最近は発作が起きていないので、まあ、このままで良いじゃね?って勝手におもってます。あとちょっと体重が気になります。
で、この病気のおかげでSEからPGになれたみたいなものなので、病気には感謝しています。私は新卒で今の会社に入社したのですが、それ以前は全くプログラミグ経験がなく、もちろんそんな人間にPGになれなんて言う人はいなかった訳なのですが、私は何故か「自分はプログラマに向いていて、プログラミグしたい。プログラマになりたい」なんて訳のわからない自信と「夢」がありまして、会社に入ってプログラミグするぞーなんて思っていたのですが、見た目の「ヲタク」臭か何かが災いして、SEをやってました。UNIXやLinux、シスコやヤマハなどのネットワーク機器、当時の口癖は「Windowsはわからん」でした。と言うか何一つ分かっていなかった気もしなくでもないわけですが・・・。それなりに楽しんでいたので、プログラミグの勉強なんて全くしていませんでした。で、バセドウ病が本格的私におそってきて、それとは全く関係ないのですが、自分の部署がつぶれて、今の部署に移ったのですが、当然、SEをやっていたので、SEでーっていう上司もいたのですが、
「あえて言おう!プログラマであると!」
な勢いで口は言っていたのですが、それ以上に体が言うことを聞かなくなって来ので、自動的に座ってできる仕事、つまりプログラマになれた訳です。実際には会社を長期休暇して、パソコンからも離れた生活(体が全く動かないので)を数ヶ月送ってから、プログラマ始動になたのですが、それが今からちょうど2年前の話なのです。
業務としてプログラムを書くと言うことを通して、やっぱりプログラミグはおもしろいし楽しいって実感しました。そして、その世界に入って初めて見えるものもたくさんありました。
「マジ、最高ス」
「こんなに幸せになるなんて夢みたいです」
「周りにも勧めたいと思います」
など、まるで何かの通販の触れ込みみたいな事を言いたくなるくらいプログラマという職業はおもしろいとおもいます。いや、本当ですよ!
だらだらとまとまりもなく時系列もばらばらで、他人様にとってはどーでも良い話だとは思うのですが、世の中にはプログラマになりたくても、なかなかなれない人もいるんだよーって
ちょっとボヤきたかったんです。ええ。
最後まで読んでいただいてありがとうございました。
(文章を書くのが面倒になり最後トーンダウンいたしまいたごめんなさい)
作者:art55
更新日:2009年1月6日 1時58分
【C#】JIS X 3015:2008を読む。2009/01/06
シリーズ化するかどうか不明です。
とりあえず8章で目がとまったのでコメント。
8 言語概要
C#は,(中略) 最新の複雑でないプログラム言語である。
確かにC#は複雑でないプログラミグ言語だと思います。もの凄くシンプルで言語部分を学習してちょっとしたコードを書き、正当なプログラム (Valid program)を生成するぐらいだったら、ほんの2,3日で可能になるのではないかと思います。
JISというかたぐるしい仕様書に、自分としてはイメージと違う文章がちらほらとあることを発見してちょっと楽しくJIS X 3015:2008を読んでいます。
作者:art55
更新日:2009年1月6日 1時21分
【セミナー】WPF/Silverlight
Silverlight 2 プログラミング 〜はじめてのRIA開発〜 基礎編
Silverlight 2のセミナーが始まったみたいです!
Visual Studio 2008ではじめるWPFプログラミング
WPFもありますよ〜って書こうと思ったら、「キャンセル待ち」みたいです。
------------------
せっかくタダで開かれているセミナーなので、
これからWPFやSilverlightを使った開発をしてみたいって人いらっしゃいましたら受講することを強くおすすめします。
テクノロジーは自分で勉強する意志を持って取得していかないと使えるものも使えません。しかし、一人でやろうとしてもどこから手をつければ良いのか路頭に迷うこうと間違いなしなので最初はきっちりとエキスパートにレクチャーしてもらって知識と知恵とやる気を充填しましょぉぉぉ!
ちなみに私はBlogを見ての通り半年くらい路頭に迷っている様をさらけ出している次第です・・・今も路頭に迷っているような気がするのですが・・・・。
作者:art55
更新日:2009年1月5日 22時56分