わいえむねっと

Contents
Categories
Calendar
2026/05
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.053 sec
Chashed: -
2010/04/10 Sat
・構造が同一の2つのDataTableが存在
・1対1のデータが格納
・一方をDataGridViewの表示に、一方をRowFilterとSortの条件に使用

しているコードがあって、ぼけと眺めてみたところ、

・2つのDataTableをマージ
・カラム名は重複を避けて識別子を付与
・識別子を適宜切り替えてアクセス

とかいうことをしていたので、マージとかせずにDataSetで管理できないのかなーと思ったので試してみる。
あと、DataViewのRowFilterとSortは即時反映のため、DataGridViewへの入力を確定した瞬間に行が消えたり移動したりするので、これもどうにかしたい。

とりあえず、RowFilterとSortから参照するためだけの管理列を追加してみる。

DataTable table1 = new DataTable();
table1.Columns.Add("A");
table1.Columns.Add("B");
table1.Columns.Add("Z");
table1.Rows.Add(1, "foo", 1);
table1.Rows.Add(2, "bar", 2);
table1.Rows.Add(3, "baz", 3);
table1.AcceptChanges();

DataTable table2 = new DataTable();
table2.Columns.Add("A");
table2.Columns.Add("B");
table2.Rows.Add(1, "FOO");
table2.Rows.Add(2, "BAR");
table2.Rows.Add(3, "BAZ");
table2.AcceptChanges();

DataSet dataSet = new DataSet();
dataSet.Tables.Add(table1);
dataSet.Tables.Add(table2);
dataSet.Relations.Add(new DataRelation("rel",
    table1.Columns["A"],
    table2.Columns["A"]));

DataView dataView = new DataView(
    table1, "Z > 0", "Z", DataViewRowState.CurrentRows);
//DataGridView.DataSource = dataView;
//DataGridView.Columns["Z"].Visible = false;

foreach (DataRowView rowView in dataView)
{
    Debug.Print(rowView.Row["B"].ToString() + " " +
        rowView.Row.RowState.ToString() + " " +
        rowView.Row.GetChildRows("rel")[0]["B"].ToString() + " " +
        rowView.Row.GetChildRows("rel")[0].RowState.ToString());
}
//foo Unchanged FOO Unchanged
//bar Unchanged BAR Unchanged
//baz Unchanged BAZ Unchanged

foreach (DataRow row in table1.Rows)
{
    row["Z"] = 0;
}
int i = 1;
foreach (DataRowView rowView in new DataView(
    table2, "B LIKE 'B*'", "B DESC", DataViewRowState.CurrentRows))
{
    rowView.Row.GetParentRow("rel")["Z"] = i;
    i++;
}

foreach (DataRowView rowView in dataView)
{
    Debug.Print(rowView.Row["B"].ToString() + " " +
        rowView.Row.RowState.ToString() + " " +
        rowView.Row.GetChildRows("rel")[0]["B"].ToString() + " " +
        rowView.Row.GetChildRows("rel")[0].RowState.ToString());
}
//baz Modified BAZ Unchanged
//bar Modified BAR Unchanged

RowFilterとSortの反映タイミングは列Zの更新タイミングで制御可能になったものの、親DataTableのRowStateが軒並みModifiedになってしまうので、DataGridView経由で編集されたかどうかが取得できなくなる。

だったらと、列Zを子側に押し付けて、DataColumn.Expression経由で参照してみる。

DataTable table1 = new DataTable();
table1.Columns.Add("A");
table1.Columns.Add("B");
table1.Rows.Add(1, "foo");
table1.Rows.Add(2, "bar");
table1.Rows.Add(3, "baz");
table1.AcceptChanges();

DataTable table2 = new DataTable();
table2.Columns.Add("A");
table2.Columns.Add("B");
table2.Columns.Add("Z", System.Type.GetType("System.Decimal"));
table2.Rows.Add(1, "FOO", 1);
table2.Rows.Add(2, "BAR", 2);
table2.Rows.Add(3, "BAZ", 3);
table2.AcceptChanges();

DataSet dataSet = new DataSet();
dataSet.Tables.Add(table1);
dataSet.Tables.Add(table2);
dataSet.Relations.Add(new DataRelation("rel",
    table1.Columns["A"],
    table2.Columns["A"]));

table1.Columns.Add("Y");
table1.Columns["Y"].Expression = "Min(Child.Z)";

DataView dataView = new DataView(
    table1, "Y > 0", "Y", DataViewRowState.CurrentRows);
//DataGridView.DataSource = dataView;
//DataGridView.Columns["Y"].Visible = false;

foreach (DataRowView rowView in dataView)
{
    Debug.Print(rowView.Row["B"].ToString() + " " +
        rowView.Row.RowState.ToString() + " " +
        rowView.Row.GetChildRows("rel")[0]["B"].ToString() + " " +
        rowView.Row.GetChildRows("rel")[0].RowState.ToString());
}
//foo Unchanged FOO Unchanged
//bar Unchanged BAR Unchanged
//baz Unchanged BAZ Unchanged

foreach (DataRow row in table2.Rows)
{
    row["Z"] = 0;
}
int i = 1;
foreach (DataRowView rowView in new DataView(
    table2, "B LIKE 'B*'", "B DESC", DataViewRowState.CurrentRows))
{
    rowView.Row["Z"] = i;
    i++;
}

foreach (DataRowView rowView in dataView)
{
    Debug.Print(rowView.Row["B"].ToString() + " " +
        rowView.Row.RowState.ToString() + " " +
        rowView.Row.GetChildRows("rel")[0]["B"].ToString() + " " +
        rowView.Row.GetChildRows("rel")[0].RowState.ToString());
}
//baz Unchanged BAZ Modified
//bar Unchanged BAR Modified

Modifiedにはならないけれど、余計な列がさらに増えたり、Expressionの中身がどうにも直感的にならなかったり。
ままならない。
2010/04/09 Fri
うちの取締役に会いにきていた協力会社のシャチョさんが人の顔を見るなり
「ちゃんとやってるか!」と言ってきたので
「やってますよ!」と答えたら
「飲みながらやってるか!」と言ってきたので
「飲みながらはやってませんよ!昨日さんざん飲んだので!」と答える。

今日も元気。
2010/04/08 Thu
前歯の先がなんか変な気がするんですけど、もしかして欠けた?
つくりなおしたほうがいいんだろうか。
ええ。差し歯のほうですよ。

あれからもう2年半になるのか…
2010/04/07 Wed
体調がよろしくないからと22時に寝たら2時に目が覚めた。
ままならない。

寝ている間に一昨日とりあえずで実装した箇所のパフォーマンス改善案が思い付いていたりしたので、その検証をしたりとか。 いけそうなので適用してみたら、パフォーマンスがはげるほど改善しました。
そしてそれ以上に精神衛生上大変よろしいコードになりました。睡眠て大事!
この場合、なにか違うような気がするけどそれはそれだよ!

あとは昨日湯船につかりながらぼけと考えたクラス再設計を適用する作業を日がな一日。
体調は依然としてよろしくない。
まぁ、今日は仕事はかどったからいいかーと焼酎を一杯飲んで。二杯飲んで。三杯飲んで。
一息ついてコーヒー飲んで。

キリンビバレッジ キリン ファイア ブラック ディープボディ
http://www.bevera​ge.co.jp/product/coffee/black_db.h​tml

ブラックでロング缶て珍しいやね。
2010/04/06 Tue
Excelへのエクスポート時にたまに書式が失われているセルがある気がすると思ったら、数値は部分書式を受け付けないんだった。
保持するには表示形式を文字列にするくらいしかないか?うーん。

<table>
  <tr>
    <td><strike>foofoofoo</strike></td>
    <td><strike>123456789</strike></td>
  </tr>
  <tr>
    <td>foo<strike>foo</strike>foo</td>
    <td>123<strike>456</strike>789</td>
  <tr>
    <td style="mso-number-format:\@">foo<strike>foo</strike>foo</td>
    <td style="mso-number-format:\@">123<strike>456</strike>789</td>
  </tr>
</table>

2010/04/05 Mon
昨日はエアコンをかけてダウンジャケットを着込んだ上でまだ寒くて、なんだよこの気候は!室内なのに!と思っていたらどうも単に自分が衰弱していただけっぽかったりしましたが今日はすこぶる快調でした。
朝ご飯も食べたし総務のおばちゃんにもらったクッキーもサクサク食べてた!

というか、なんで今日はこんなにおなかすいてるんだと思ったら、そういえば昨日はろくなもの食べてなかったような気がしたのでもう少しなんというか生き方をなんとかしたほうがいいんじゃないのかと思ったり思わなかったり残件の実装をしたり不具合を修正したりして一日が終わるのでした。 今日から青海苔ではなく青さ粉ですよー。
2010/04/04 Sun
この土日に花見に出掛けられた方も多かったようですが、そういえば自分は花見とか以前にこの土日は今朝5時くらいにコンビニいった以外は部屋から出ていない気がしますね。

気がするというか確実にそうだけど。
まぁ、作業はそこそこ進んだのでよしとしたい。
2010/04/03 Sat
いつも買っている紅しょうがは60gしか入っていなくて買うときはいつも2袋買っているのですが、もうなんか面倒なので業務用を買いたい。

紅しょうが・みじん切り・1kg【業務用食材】 - ネットショップ・おこデパ
http://okodepa.ne​t/?pid=820145​9
販売価格 473円(内税)

GS) 華印 紅生姜 千切 1kg 業務用食品ショップ マカリロキッチン
http://www.makari​ro-kitchen.co​m/SHOP/tu171850.h​tml
価格: 370円(税込)

漬物 > 紅生姜 千切1kg
http://www.takara​food.jp/10_188.htm​l
販売価格 380円
あれ?MSDNのデフォルト表示がライトウェイトになった?
というか、クラシックはJavaScript切っているとスクロールすらできないのではげろといつも思う。
2010/04/02 Fri
PrintPreviewDialog.ShowDialog でプレビューは表示されるのに、いざ印刷ボタンを押すと白紙の紙がでてくるのでなんだこれと思いつつ PrintDocument.PrintPageイベントハンドラをぼけと眺めて眺めて PrintPageEventArgs.HasMorePagesをfalseにするタイミングで PrintDocument.PrintPageから参照しているメンバをクリアするようにしたら普通に印刷されるように。

え。ああ、プレビューのタイミングで生成したイメージは破棄して生成しなおしてるのか。 先週はずっと体調が悪く今週はずっと布団に頭から突っ込んでじたばたしたい状況が続いていて これは来週も思いやられるなとぐんにょりしながら帰宅してPCにログインしたところ なんかシキさんがへこんでいたので元気になりました。
やったね!
2010/04/01 Thu
出社支度中、見慣れないビニール袋があったのでなんだろうと覗いてみたら、あんドーナツとウーロン茶がでてきた。

あ。一昨日の帰り道で買ったのか!? 昨日まで動いていたのに急に動かなくなってなんだえーと思ったら、年度が変わったせいでした。
年度単位でデータを切り替えるシステムなので。
今年度のデータなんかまだないよ!