たきるブログ

C#やOracleなどの情報を書いています。

【C#,VB】nullを許容する、読み取り専用にする、文字色・背景色の変更ができるDateTimePicker

[2018/02/24]
BackSpace、Deleteで日付をnullにした後、どんなキーを押しても日付が復元されてしまっていたので、数字キー、数字テンキー、十字キー以外では日付を復元しないように修正しました。

[2018/02/26]
BackSpace、Deleteで日付をnullにした後の以下動作を修正しました。
ValueChanged()イベントは、nullにした時、nullから日付に復帰した時も発生します。

  • カレンダーを表示後に日付を選択するとビープ音が鳴ってしまう。
  • カレンダーの月移動ボタンを押すとビープ音が鳴って日付が確定され、カレンダーが閉じてしまう。
  • ValueChanged()イベントが発行される契機が通常と合致しない場合がある。

[2018/02/27]
Formatプロパティ、CustomFormatプロパティの設定が正しく反映できない動作を修正しました。
残念ながらDataBindingsプロパティは使えません・・・。

[2018/02/28]
Valueプロパティに対して、DataBindingsプロパティを使えるようにしました。
ReadOnly -> null -> Not ReadOnly でnullに戻らないのを直しました。
ソースを綺麗にしました。

[2018/03/01]
・AcceptNullプロパティを設けて、null値の入力を許可するかどうかを設定できるように修正。
・ReadOnly(Label) -> null -> Not ReadOnly(Label)で、nullに戻らないのを修正。
Valueプロパティ直接変更によって、nullになる前と同じ値に復元された時、イベントが走行しないのを修正。
・ReadOnly <-> ReadOnlyLabelの切り替えの誤りを修正。
・Textプロパティの直接変更で挙動不審になるのを修正。
[2018/03/03]
NuGetに登録しました。
www.nuget.org
www.nuget.org

開発環境

長年の悩み

Visual Studioにある標準のDateTimePicker、これはカレンダーもでてきてUIも優れていていいんだけど、まさかのnullにすることができない!
入力項目として、必須項目ならそれでいいんだけど、普通任意項目とかあるよね。
どうしても、DateTimePickerにnullを入れさせたい!
調べまくってると、NullableDateTimePickerだのUltraDateTimePicker、探してたらほんと色々あったけど、どこかがイマイチだったりしてた。
VisualStylesが無効でないとダメだとか、Tab内だとダメだとか、TableLayoutPanel内だとダメだとか、色んな動作を組み合わせて使ってみるとダメなところが見つかったりだとか。

結論

散々調べた結果、俺の中で一番スマートで、100%(だと思う)真っ当に動作するDateTimePickerを作ることができた!
利用には困らないレベルになっていると思うけど、他のコントロールやプロパティと組み合わせてうまく動作しないという場面があったら、直したいから教えてもらいたい。

動作内容

  • Valueにnull指定を可能。
  • BackSpace, Deleteキーでnull入力が可能。
  • ReadOnlyプロパティの追加。(TextBoxで置き換える)
  • ReadOnlyLabelプロパティの追加。(Labelで置き換える)
  • BaseBackColor, FocusBackColorプロパティの追加。(フォーカスアウト/イン時の背景色)
  • BaseForeColor, FocusForeColorプロパティの追加。(フォーカスアウト/イン時の文字色)
  • 標準DateTimePickerと同様のイベント発生起因を踏襲。
  • Format, CustomFormat, Visibleプロパティも標準動作を踏襲し、ReadOnly, ReadOnlyLabelプロパティの状態を加味する。
  • OnXXXX()で、ReadOnly, ReadOnlyLabelプロパティの状態を加味する。

背景色は、マウスカーソルを行き来させるとたまにちらつくのが難点だけど、まぁ許容レベルということで。

ウィンドウメッセージはちゃんとconstにした方がいいかもしれないし、DesignModeも別出しにした方がいいでしょう。
とりあえず、1ファイルで実現できるコードを全部載せています。

2019/10/11 gistによる公開を取りやめました。

続きを読む

【TortoiseSVN】他を諦めてオーバーレイアイコンを確実に表示させる方法

事象の発生

利用しているPCを換えたら、TortoiseSVNのオーバーレイアイコンが表示されない、表示されても安定しないって現象に見舞われた。
調べても、レジストリ『HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers』の中身をどうにかせいってことしかなかった。
元々のPCにはTortoiseSVNDropBoxも入れてたけどちゃんと表示されてたのに。

やってみたこと

上記レジストリは15個までしかダメということで、ならばTortoiseSVNによって作成されたキー名の先頭に半角スペースを入れてみた。(元々2つ半角スペースが入っているところを、4つ半角スペースに変えた) 『  Tortoise1Normal』とかを、『    Tortoise1Normal』とかに。
すると、表示されるもんはされたけど、管理対象外時のオーバーレイアイコンとかだけ表示されないという片手落ちになった。

結果

オフラインファイルなんてのは使わないし、DropBoxはタスクトレイから状況が確認できるところから、ムリにオーバーレイアイコンはいらんだろってことで、めんどくさくなって以下を行った。

  1. DropBox用のキーをすべて削除。
  2. 『Offline Files』キーも削除。
  3. コントロールパネルから『同期』と検索して同期センターを表示し、左メニューの『オフラインファイルの管理』から『オフラインファイルを無効にする』ボタンを押す。
  4. PC再起動。

TortoiseSVNのオーバーレイアイコンが安定して動作してほしいということを最重要視したため、これでいいかな、と。

【C#】フォーカスの遷移順にコントロールを取得する

個人的に、画面に貼り付けられている全コントロールを、フォーカス遷移順に取得したかった。
調べまくった。

参考サイト

コントロールのTabIndex順で処理したいことってあるよね。階層のTabIndexを表現してみよう。 - Bug Catharsis
ここに記されている方法は、SplitContainerが絡むと、希望する結果にはならない。
試していないけど、結局、階層関係が絡んでくるとダメな気がする。

続きを読む

【VMware】ディスクの圧縮を行う

それぞれ、ゲストOS上で実行させる。 ほかにも方法があるけど、この方法が一番手っ取り早い。

ゲストがWindowsの場合
C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe disk shrink C:\

ゲストがLinuxの場合
sudo vmware-toolbox-cmd disk shrink /

ゲストがMacの場合
sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk shrink /

VMware Fusionに限っては、ゲストOSの設定画面からクリーンアップができる。

qiita.com

【Windows】Windows10でUASP対応外付けSSDを使ったときの速度

OS:Windows 10 x64
SSD価格.com - インテル 520 Series SSDSC2CW120A3K5 スペック・仕様
ケース:1分BOX2.5 USB3.0 GREEN LINE(CGL25U3S6G)|センチュリー(CENTURY)

急きょ、外付けディスクが必要になり、SSDがいいなーと思ってA-DATAのSSDを買おうかと思ったけど、Intel SSD 520が1台余っていることを思い出し、UASP対応のケースだけ買って、UASPいかに!と思って試してみた。

このケースを買ったのは、量販店に売っている商品の中で、パッケージに表示されている速度が速かったから。 もう1段階+2MBくらい速いものもあったけど、そちらはWindows 7に繋いだ時の速度が10MBくらい違ったので、相対的に満足しそうなのがこちらだったため。

デバイスマネージャー上で、『USB接続SCSI(UAS)マス ストレージ デバイス』ってなってると、UASPで動作しているそうだ。 f:id:metroit:20151031004325p:plain

Crystal Disk Mark x64で試してみた結果、以下の通り。 f:id:metroit:20151031002857p:plain

ついでに、まったく同じSSDを内蔵しているので、それの結果を見ると、以下になる。 f:id:metroit:20151031003523p:plain

UASPすげえ・・・。 もはや、ムリに内蔵にこだわる必要はないかもしれない。 もちろん、マザボ側の対応とかもあるかもだけど。

てことで、Windows 8.1 x64の環境でも試してみた。 f:id:metroit:20151031011342p:plain

ダメじゃん・・・。 デバイスマネージャー上はマスストレージデバイスって入ってるけど、相性の問題なのか、全然ダメだった。 新しめなコンピュータで利用した方がいいかもね。