2012年9月3日月曜日

DataGridViewヘッダーの拡張に関する問題の解消方法(DataGridViewのヘッダーを使わず、ヘッダーを簡単に自作する)


下記の話が長いので要約すると、、、

業務プログラムでDataGridViewを使う場合、DataGridViewのヘッダーを使わずデータ行・列の上部と左部をヘッダー行ヘッダー列として使う。
そう決めてプログラムを作れば面倒なDataGridViewのヘッダー処理は全て不要になります。
すると開発はスピーディーになりメンテナンスもし易くなります。

DataGridViewのヘッダーは使わない。これで幸せになれるという話です。

ただ見た目はどうでしょう・・人それぞれですからね。






(2013/2/22コード追加)

文字で説明するのもなんなので、サンプルコードをUPしておきます。興味あればご覧ください。
※質問にはお答えしませんので、こちらの超!素晴らしいサイトで調べてください
※この、超!素晴らしいサイトがあるおかげで、先回のPG開発工数は1/3減少しました@@(感謝)

サンプルソリューション→ DataGridHeaderSample.zip

※VS2010で作成しています
※.net framework 4
※WindowsFormアプリ
※サンプル用に改造したので使っていない変数やコードありますが、ご了解を。






ここからはどうでも良い文章になってしまいましたが、残しておきます。


「 前置き 」

と言う事で、また今回もDataGridViewに表示するデータは全て手作りで作ってます。
そしていつも問題になるのが、ヘッダー。
特にDataGridViewになって恐ろしく頭がよくなった感じで、ホント自動でなんでもやってくれます。しかし自分でヘッダーをカスタムしようとすると突然大きな壁に当たりますね。

今回はヘッダーと呼ばれる固定の行列が、初期で8行(常時固定4行)、2列、あります。DataGridViewのヘッダーを拡張して作ろうかと思いnet徘徊してみましたが、あまり現実的でない情報しかなく、しかも.net2.0時代の物ばかり。その辺から既にDataGridViewのヘッダー拡張手法は進化してないよう。

解説を見ると・・・

私の嫌いな、行、列、をドロー中のwindowsから制御分捕って線画しなさいと(大昔の様に自分で画面書け的な)。私はこの手のwindowsドロー系の制御をプログラマが行う事は嫌なのでやったことはありません。
理由は大体昔から相場が決まっていて、罫線が出ないある部分だけ線画されない、そんなMS側ブラックボックスの問題が決まって必ず出るからです。使うと使っただけ馬鹿を見ます。
それにMSのブラックボックス処理はパッチ入らない限り治る可能性はゼロで、第一プログラマ側では内部コードは永遠にコントロール出来ませんから。





「DataGridViewにおけるヘッダーの考え方と作り方」

私のやり方はヘッダーを非表示にし使いません。ヘッダーとは関係ありませんがデータバインドも使いません。データ領域には自分で行や列を作って1行づつADDしながら行を書きカラムを書いて行きます。
そしてここからここまでをヘッダー(固定行)にする。そう決めてその部分だけ色を変えてみると・・・

立派なヘッダーに見えます(笑)

  // ヘッダーの行数・カラム数(0~)
  const int _GridHeaderColumns = 1; // 2カラム
  const int _GridHeaderRows = 4; // 5行

  //行列ヘッダー非表示
  dataGridView1.ColumnHeadersVisible = false;
  dataGridView1.RowHeadersVisible = false;

  // 固定行・固定列(ヘッダー)
  dataGridView1.Columns[_GridHeaderColumns].Frozen = true;
  dataGridView1.Rows[_GridHeaderRows].Frozen = true;

  // 色を付ける
  ・・・
      





「 いちいち一行ずつ自分で行を作るの!?そんなの面倒・・・と言う方に 」

面倒と思われるかも知れませんが、やってみると結構簡単。1行作ってカラムに文字を入れ色を変える。たったそれだけです。
色を変えて固定にしスクロールしても動かないようにすれば誰が見てもヘッダーにしか見えません。そしてその下にDBから読んで自分で加工したデータ行を必要行数分作ってゆくだけ。基本縦loopを使って作表完了。

縦計が必要ならloopで表を作った後に、更にまた1行目からloopさせ合計計算する。1度のloopでなんでもしようとせず、シンプルloopを数回使った方が速度が速くメンテも楽です。

またデータBINDせず自分で行を作っていくなら、あとの処理を考え各行に目印となる数字を入れると楽。私は0~の数字に意味を持たせ(0:ヘッダーカラム名、2:ヘッダーカラムの単位、~5:データ行の△~)データ行は小計を入れるタイミングの行に目印をしたりしています。そしてある行を取得したい場合はloopさせその数字をhitさせれば処理も簡単です。

これは注意点ですが、美しく作り過ぎない事です。最左に数字入れ非表示にする、そういうのを嫌う人がいますがシステムはコストを掛けず楽に動いて楽にメンテ出来る事が一番の目標です。オブジェクト思考信者になる必要は学者でないなら不要です。





「 すると、また疑問に思われる方には・・・ 」

自作コードだと最適化されていないので速度も出ず全行表示されるまでに時間がかかるのでは?そう思われる方もいると思いますが、私的に言うと、遅いのはデータ表現をオブジェクト化し過ぎです。
何でもオブジェクト、そして入れ子、階層化させ1行を表現、そんな作りにしていると全行表示するに数十倍~数千倍の時間かかると思います。いったい1行作るのにオブジェクト幾つ作る必要があるのでしょうか。

WindowsPhoneアプリの開発で、そんな美しいコードで多量のオブジェクトを生成し表を作る高級サンプル引っ張ってきましたが、残念ながら遅すぎて使えませんでした。
このサンプルはオブジェクトが入れ子になっており、あるデータを1行表現するオブジェクトの中に子孫オフジェクトが合計100程。たった100行作るのにその高級サンプルは一万個のオブジェクトを生成していました。

構造もコード的にもとても美しかったのですが、これは残念ながらデータ表現にオブジェクトを使い過ぎた典型的な失敗例です。手時計による実測では、昔ながらのキタナイコードで100行を瞬時に出力するに比べ高級オブジェクトは100行の一覧表示に30秒も必要でした。これはキタナイコードの1,000倍の時間です。厳密に測れば1万倍の時間がかかっていたかも知れません。

PCのパワーでも同じで、最速に作るならなるべくオブジェクト使わない様に大昔の上から流れるようなキタナイコードを書くと速度は速いです。ただメンテが・・・でしょうから、その辺の比率は最大6:4か7:3で、この:4、:3がオブジェクト指向的な作りです。

ただ・・・一歩引いて言うと、開発の規模によると思います、クラスを作る=再利用用途、は。小さな数十人月程のシステムの場合、再利用するにも機能が少なすぎて再利用する場面が少ないことが多く、そんな場合は机上で厳密にクラス設計をするだけ時間の無駄。ぱっと重要な部分のみ大まかにしっかり設計し、その他の部分は各人へ、そういうのが良いかもしれません。
ただ、超!出来る方がベースとなるフレームワークを作るなら話は別ですが。個人的には自作フレームワークを作らないのなら、クラス設計による処理の再利用化?共通化?だけを行っても時間がかかり使いづらくあまり意味がない気がします。
またもったいないからと、あまりにミクロな機能を共通化して回ると、クラスだらけで探すのも大変、、生産性は確実に落ちます。
とにかく、規模ですね、システムの大きさによると思います。でかいシステムはハードに次もむ¥もでかい=処理系の処理能力が高いことが多いですし。



「 再度、結論 」

ヘッダー=DataGridViewで言うヘッダー
そう思ってしまうとこの部分を拡張しないとヘッダーが作れません。すると嵌ったりオブジェクトを使い過ぎるだけです。
そういった場合はDataGridViewのヘッダーを拡張するのではなく、自分の頭を柔らかく拡張した方が賢明です。

データ領域だけどこの部分はヘッダー(固定行)として使う、そう決めればDataGridViewにおけるヘッダー問題は全てが一瞬で解決し、問題はゼロになります。




2012年8月28日火曜日

制約を有効にできませんでした。行に入力できるのは、Null 以外の値、一意な値、あるいは外部キーですが、この制約の違反が 1 つ以上の行で発生しています。


掲題、
制約を有効にできませんでした。行に入力できるのは、Null 以外の値、一意な値、あるいは外部キーですが、この制約の違反が 1 つ以上の行で発生しています。




原因は、TableAdapter(データセット)絡み。ただのテーブル読み込みFill(Getdata)でエラーが出る。
私の場合、TableAdapterを作った後で、あるテーブルの文字(char)桁数を変更したため、データセット上の静的な型情報と、リアルテーブルの情報とが合わない。そのため実行時にエラーとなり変に和訳されたメッセージ出力された。要するにデータセットとリアルテーブルが合致していないため。


よくある?事ですね。
VSのデータセット上にある型指定されたテーブルスキーマーは堅物、一度作ってしまうとテーブル変更に対応出来ず、恐ろしい問題を起こすことがあります。

・・クリスタルレポートはテーブルの変更時、手動クリック一発!で、保有スキーマの自動修正(最新化)を行ってくれるのに、なんでTableAdapterは出来ないんでしょ?

解決には、現在のテーブル構造とVS上の静的な型情報を突合せ、問題箇所を見つけるしかないです。集団開発であれば、体制がしっかりしていない、もしくは開発進行レベルの低い現場で多発しそうな問題ですね。


 

(余談)

この.net仕様に含まれない、作成するとソースコードが自動生成されるTableAdapterですが、マスターメンテなどデータソースからドラッグ&ドロップするだけでプログラムが瞬時に1秒で完成してしまう。画面1枚1秒!、と言う恐ろしく楽な代物ですが、過去の怖い面の話。

プロジェクト内部のフォームやその他に対してイレギュラーな操作を行った場合、恐ろしい結果を引き起こすことが稀にあります。
私の場合、結果的にプロジェクトが壊れソリューションから作り直しました。


原因はTableAdapter使ってマスタメンテ作った後にSQLサーバー上のテーブルをいじった。上記の些細なメーッセージを発生させた原因と同じですね。

結果あるはずの項目がなくなり、ないはずの項目が追加され、桁数やデータ型が変更になった結果、フォームを開くと例の赤×のエラー画面が現れ、フォームが壊れた。
全てのマスターメンテフォームが壊れている(壊した)ことが発覚し、当該フォームを全て削除したがエラーが取れず、最終的にプロジェクトが壊れたと判断し、そのソリューション自体を捨て、新たなソリューションを作り直した。





どうもこのVSのウィザードは昔から信用できない。と言うか、.netバイナリーは大変素晴らしですが、VSが自分で自動生成したソースと、その自動生成されたソースを変更するためのVSの内部コードが怖い。上記フォームが壊れ始めた時に内部バグがプロジェクトを壊した気がする。あくまで想像ですが。

でもこんな簡単に酷い状況になったのはVS2010が初めて。フォームの画面があの赤×になったのは初期の.net2.0以来10年振り?軽微なのは以前のVSにもありましたが、慎重に進めた方が良いです。





ただそうなった原因はどうでも良く(私はMSの人間でないから)、とにかくこちらの開発を止めない対応が必要で、それは・・・
私はTableAdapter絡みで何か修正を行う時は、それがたった1行の場合でもソリューションフォルダ自体のバックアップを行います。何か問題が起きればすぐリストア。

Ctrl+C、Ctrl+V、とわずか0.5秒で終わる事をやらなかった為に・・・

ただソース管理入れてる人はどうするのでしょうね?チーム開発してる人。
簡単にリストア出来るのかな?自分のコードならそのコードのみリストアすれば良いけど、TableAdapter等のMSが生成・変更したプログラムが何処まで広がってるか?影響してるのか?そんな事分かるのかな・・・?




_

2012年1月6日金曜日

カスタム投稿タイプ、カスタムタクソノミー

う~ん、掲題使って作ってましたが、まだ駄目っぽそうです。
たぶん私の設定がわるいのだと思いますが・・・
これ等枯れていないどころか、WordPress3でリリースされた最新機能(だったかな?)
※ちなみにVer3.3.1–ja 3.2も使いました


functions.php内に設定するカスタム投稿とカスタムタクソノミー各種パラメーター
本やnetの例を使って何通りか試してみたのですが、

記事投稿や、カテゴリー関係、
何をやっても(新規、replace)クリックすると白い画面が出てしまいます。
本当は、登録しました!と出てくるはずなのにね。

が、←で戻ってみると、全て登録や変更は行われていたので、
このまま客に、こうなるけどとりあえず我慢して!
そう言うかな?と思ってましたが、、、やめました。


理由は・・
WordPress側の仕様変更が怖い。
気を付けないとある時突然動かなくなった・・とかHPが表示できない、となりそう。

また、どうもパラメーターの設定をトライアンドキャッチで調べてゆかないと動きが見えないのと、
見えたところで、パラメーターの仕変が怖い(動きが変わる)ので使用中止!

残念です。

でもこういうのがオープンソースの怖い所ですね。
なんだか仕様がかっちり決まらないまま(or仕様がこちらに見えないまま)
結構ラフなUpdateがどんどん入る気がする。
それにWordPress内部は・・・基本的にブラックボックスと考えた方が良いから触れないし。

結局、カテゴリを入れ子にして、ごく一般的なサイトにすることにしました。


---------------------

そういえば、怖い事がありました。WordPress初級者の失敗談です。

 設定 → 一般設定
 「WordPress アドレス (URL)」、サイトアドレス (URL)
 これ等は共に http://~~.com/wp になっています
 私はWordPressを/wp内にインストールしたからです。

しかしHPのルートは.com/wpではなく、.com/にしたい(する)と思います。
その時、サイトアドレス (URL)から/wpを取り除くと、ルートがサイトのアドレスになりますが、
私は間違って「WordPress アドレス (URL)」から/wpを取ってしまいました。
そして保存。

そしたら・・・

当たり前ですが管理画面開こうとするとエラーになり開けなりました!
WordPress本体のプログラム群をインストールした場所の「情報だけ」変更してしまったので(~.com/)、WordPressが実際の場所(~.com/wp)を見つけられなくなったからです。
ログインページが見つからないなどとメッセージが出ます。

これにはちょっと焦りました。

まさか再インストール!?今までの変更がおじゃん!?と焦りましたが。
冷静に考えDBのテーブル内のデータを触ってみたところ無事に管理画面が出るようになりました。


復旧方法は、phpmyadminを使って、WordPressのDBを開く
wp_optionsと言うWordPressが設定情報の保管用に使っているテーブルがあるのでクリックし、表示タブをクリックして開くと、200レコード近くの設定情報が保管されている

その中のカラム option_name を見てゆくと siteurl があり、option_valueが「http://~~.com」となっていたので、これの最後に /wp を追加し「http://~~.com/wp」として保存。
これで正しいWordPressをインストールしたディレクトリを指定し直す事ができ、ことなきを得ました。
危なかった・・・

homeはワードプレスのホームディレクトリ(url)の場所、blog_charsetがUTF-8になっていたりと、色々な情報が入っている、重要で面白いテーブルです。
設定画面で色々変えると何処かに保管されているので、壊れるの覚悟で色々遊んでみても面白いと思います。

生データの編集は鉛筆マークを押すと、編集モードになるので変更して保管(実行するボタンクリック)。

---------------------

WordPressの良い所は、DBの構造が非常に簡単なこと。
普通ならぐちゃぐちゃ状態でしょうが、これは大変良い事です。設計者>素晴らしい

DBは多分デザイナーだと不明と思いますが、
暇な時にでも中身のデータを見たり、いじったり!(壊れるかもしれないけど)遊んだ方が良いです。
すると机上ではなく、実際にどこ何が入っているか見えますし、何したらどうなるかとか、これやると壊れるとか実際にわかりますので。

頭でなく、体で覚える非効率な方法ですが、実はこういうのがトラブル時に役立ったりします。
トラブル時の焦った状態だと、冷静になれない事が多く(客のプレッシャー、隣で仁王立ち「今すぐ直せ!」など)。冷静でない場合は頭で覚えた操作はあまり役に立ちません(焦って思い出せない)。

ところが体で覚えた操作はこの時大変役に立ちます。無意識で手が動かせるからです。
新人の頃はシステム開発の時に、よく色々いじって遊んでました。
誤って壊して始末書もありますが、損害賠償に発展しクビになった人もいるので注意が必要ですが。

---------------------

あと、初級者の私には嬉しい発見をしました。
普通常識なのかな・・?

/WPディレクトリにWordPressをインストールし、サイトのルートも/wpにしていて、使っているテーマファイルと、実際にTOPページが入っているwwwルートの場所が異なっているので、
(全てにテーマファイルを使用しておらず、TOPやプロダクトの拡張子はhtmlのままで、中にWprdPressタグや関数を書いて表示させている)
各種テーマファイル内で指定する相対ディレクトリの位置関係が良くわからなかったのです。
例えばsingle.phpで指定している画像ファイルを何処に置けば良いの?とか。

そしたらこれって相対ディレクトリー指定の最初に / を付けると上手くいくのですね!
 これまで : images/~.gif
 つけた  : /images/~.gif
つけたらhttp://~~.com/images/~.gif と、見れるようになりました。
1日嵌っていたので見つけたときは喜びました。

/ をつけないと、記事ページを開いたときに、
その記事ページurlの最後に/images/~.gifがついてしまい、
当然そんなディレクトリーは存在しないので画像が×に。



ただ・・・
これもWordPressの仕様変更が怖いです。
相対ディレクトリーに対する/の仕様が変わったら、画像全滅です。
絶対urlにすれば良いですが、普通は相対url指定ですもんね。

それにテーマの相対urlこれって、なんだか本に書いてる事と上記の操作は違う気がします。
正しい運用方法は設定画面でサイトアドレス をwwwルートにするのが正しいと思いますが、WordPressにルートを色々いじくられたくないのでそうしています。
ただこうするとイメージファイルがダブってしまうので、こうするとダブらなくなるので良かったと思ってますが、本当に正しい指定方法なのか?調べないとですね。

こういう突然の仕変はマイクロソフトが得意ですが、
・・・先日もexcelのグラフがいきなり壊れた・・のはMSのアップデートが原因。


---------------------

と、こんな感じで使っていると、そのうちWordPressの事が好きになるのでしょうね。
ただ・・・
私はソフト屋なので、WprdPressを使うようなHPの仕事はない!です。
ただ1回のHPリニューアルの為にWordPress覚えた今回は、費用対効果としては最悪です。

が、一般常識としてのWordPress情報を入手できるので良しとしてます。
でも今の所、なんだかややこしいですけど、WordPress。。


_

2012年1月2日月曜日

WordPress

ソフト屋が、他人の作ったプログラムを使うのは、少々辛いものがあります。
・・なんでこうしないの?とか、何でそんな使いづらくしてるの?とか、裏が見えてしまいます。

今回知人店舗のHPリニューアルをやる事になり、
WordPressを使う事になったので、仕方なく?利用者側として使ってます。


WordPressはブログシステムと思われてますが、
エンドユーザーに動的更新可能な機能を提供するシステムです。
エンドユーザーにブログ投稿機能を使わせ動的更新機能を与え、デザイナーはいかにそれを感じさせない様HPを作ってゆく。

デザイナーならテーマカスタマイズするのは当たり前で、ちゃかちゃか美的HP作ってしまいます。流石!


が、非常にまれにjsやPHPに首を突っ込んでいるデザイナーを見かけます。
プログラム基礎も分からず適当にやって取り敢えず上手くいっているようなケースで、デザインはプロでもプログラムは 『 素 人 』 ですので、かなり危険な行為と思います。

デザイン業界はMACユーザが多い事からセキュリティーにさほど関心を寄せず。
興味に流され専門外分野にまで首を突っ込まない事をお勧めします。
ホント後で痛い目みますよ。

※これは本物のPHPWebアプリや自作JSの事で、
  WordPressで作ったサイト内phpなら実害出ないので問題ないと思います


そのWordPressですが、数々のバージョンUPにより、
管理機能のカスタマイズもかなり可能になってきました。

優秀なプラグインも多数存在していますし、
お客(ユーザー)は使い易くカスタムされた管理画面より、情報を発信することが可能になっています。

今回、カスタムポストタイプ、カスタムタクソノミーと言う、
新しい管理画面カスタマイズ機能もその一部ですが、面白いですし、結構楽です。

viewばかりに力を入れることが多いですが、
管理画面のカスタマイズ性を向上させる機能追加は、
お客(ユーザー)にとても優しいシステムになります。


またDBの構造が大変シンプルで、
認証等絡む面倒な管理基本機能はWordPressに任せ、
ユーザーには投稿のみ使わせ、
View部分で直接SQLを発行して表示させるプログラムを書く。
その部分のみ汎用化してシステム化を行い他案件に用いても良いかも知れません。


ただ・・拡張子がhtmlでなくphpになる事が、私的には気に入らないですね。
また動的ページはSEOを工夫しないとイケマセンし、
商品UPしてSEO上がる時代でないですし、集客できないHPは死にコンテンツです。プログラマーもデザイナーも、作業の20%はSEO対策に時間を使うべきです。

全工数の1/5とは、とても大きな工数ですよね・・・。
しかし死にコンテンツには何の価値もありませんから。


もう少しいうと、WordPressの管理画面もあまり使いやすいとは思えず、
誰にでも汎用的な管理画面が必要とは思いませんので、
いっそ通常通り自作(通常のWebシステム化)するのも良いかも知れませんね。

ただ・・・すぐこういう発想をする事がシステム屋の悪い癖です。
長いモノに巻かれたくない人々の集まり、ですかね?
良くないですね。私を含めて。


この本がWordPress素人の私にも分かり易かったです。
簡単すぎず、突っ込み過ぎていない。
取り敢えずWordPressの基本部分を抑えれば、プログラマーであれば後はどうにでも出来ます。



※上記はアフリエイトですので、嫌いな方は検索から行って下さい。


_