ゴミ箱.net

汚物は消毒

.NETのインターフェース継承の闇は深い

.NET FrameworkのComboBoxには、プロパティDisplayNameを設定することで、プロパティDataSourceに設定したリストの要素の指定したプロパティを勝手に表示してくれるという便利機能がある。リストの要素を表示文字列に読み替えるためのコードをわざわざ書かなくてすむので重宝する。(ちなみに、複雑な読み替えの場合に自前でコードを書くのであれば、イベントFormatのイベントハンドラを定義すればよい。)

ところがこの便利機能にはちょっとした罠がある。DataSourceに設定したリストがSystem.Collections.Generic.List<~>型で、かつ要素の型としてインターフェースが指定されている場合に、プロパティを表示してくれないことがあるのだ。

続きを読む

スポンサーサイト

PageTop

データバインドされたDataGridViewに勝手に列が追加される件

Visual Studioを使って.NET FrameworkのGUIアプリケーションを作成する。

前提として、フォームにはDataGridViewとBindingSourceが存在するものとする。
DataGridViewのプロパティDataSourceには、BindingSourceを設定する。
そしてBindingSourceのプロパティDataSourceに、publicなプロパティを持つクラスをプロジェクトデータソースに登録して指定する。あらかじめプロジェクトをビルドしておいた後、プロパティエディタで「プロジェクトデータソースの追加」を選択してデータソース構成ウィザードを開き、アプリケーションデータの取得元としてオブジェクトを選択する。その後、対象のクラスを選択すればよい。

このとき、フォームエディタを開くたびにDataGridViewに勝手に列が追加されるのだ。Visual C# 2010 Expressでも、Visual Studio 2012でもこの挙動だった。
最初に設定したときに列が追加されるのはまあ仕方ない。だが、その後で手動で列を消したとしても、フォームエディタを閉じて再度開くと消したはずの列が復活しているというのが嫌なポイント。何度でも、何度でも、な・ん・ど・で・も!
DataGridViewのプロパティAutoGenerateColumnsをfalseに設定すればいいのか?と思ってやってみたが、まったく効果はない。(そもそもこのプロパティはデフォルトがfalseのはずだ。)

回避策としては、フォームエディタ上ではDataGridViewのDataSourceを設定しないようにする。そしてFormのLoadイベントでDataGridViewのDataSourceにBindingSourceを指定すればよいだろう。
フォームエディタにおいて列のプロパティDataPropertyNameを設定するときに候補が表示されなくなるが、そこは気合でなんとかしてほしい。

PageTop

Windows VistaにVisual Studio 2012を入れて悲惨な目に遭った奴m9(^Д^)プギャー

Windows VistaのマシンにVisual Studio Express 2012をインストールすることはできない。

インストーラを実行しようとしたら、最初は何にも警告も出ずにインストールプロセスが進行するが、最後の最後にエラーが出る。いちおうインストールは完了するが、起動しようとしてもエラーが発生してできない。
最初にOSのチェックぐらいしろよ糞豚野郎。

しかも、アンインストールしても完全に元の状態には戻らない。使えないゴミを始末してめでたしめでたし…とはいかないのだ。
ビルドするたびに「2008は有効な警告番号ではありません」という意味不明な警告が出るようになり、非常にうっとうしい。
それだけならともかく、Visual Studio 2010をインストールしていると、どういうわけか.NET Framework3.5以下をターゲットとしてビルドしたときにリソースによる多言語化ができなくなるというステキな置き土産まで残しやがってくれます。
どうやらリソースのDLLが常に.NET Framework4.0向けにビルドされてしまうようになり、ロードできなくなってしまうらしい。

その場合の対処方法。くれぐれも自己責任でお願いします。

レジストリの以下のキーに対し、値を変更します。(これはもしかするといらないかも?)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows
名称: CurrentInstallFolder 値: C:\Program Files\Microsoft SDKs\Windows\v8.0A\→C:\Program Files\Microsoft SDKs\Windows\v7.0A\
名称: CurrentVersion 値: v8.0A→v7.0A

また、レジストリに以下のキーが残っていると思うので、丸ごと消してください。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0
このキーはVisual Studio 2012が裏で呼び出すMicrosoft SDKのパスを指定しているのだが、Visual Studio 2012を削除しても消えてくれない。
そしてこれが残っているせいで、Visual Studio 2010がMicrosoft SDKのパスを正常に認識しなくなり、上に書いたようなおかしな挙動を引き起こしているようだ。
レジストリを編集したらプロジェクトをリビルドすればおk。

PageTop

フォームの上に透過画像を重ねて表示するウルテク

麻呂は、.NET Frameworkでコントロールを持つフォームの上に透過画像を重ねて表示したいなあと思いました。

KanjiCross1.png
このように、ラベルやテキストボックスが存在するフォームの上に、○を重ねて表示するのだ。
最初はフォームにPictureBoxや独自Controlを貼り付けて、背景を透過させようと思っていた。しかし、いろいろ試したのだがどうしても実現できなかった。プロパティBackColorにTransparentを設定することはできるが、本当の透過じゃなくて単に親の背景色を持ってきているだけらしい。

じゃあどうすればいいの?

続きを読む

PageTop

.NETアプリの設定ファイルのパスを固定化するウルテク

.NET Frameworkでアプリケーションを作ると、アプリケーション設定を扱うのがアホみたいに楽になる。
テキストボックスなどにバインドするだけで勝手に設定値と表示が連動するし、Properties.Settings.Default.○○という設定値用の変数が自動で生成されるのでプログラムからの取得・設定が簡単にできる。

そんなアプリケーション設定だが、ファイルシステム上のどこに値が保存されるのかが動かすまで分からないという致命的な欠点がある。どうやらEXEファイルの絶対パスから求めたハッシュ値によってパスが決定されるらしい。
これのせいで、アンインストールするときに自動で削除するということができないのだ。

だが、我らが偉大なゲイツ神はそういうときのための対処法を用意してくださっていた。

続きを読む

PageTop