System.Windows.Forms.MonthCalendarで日付の色を変える

MonthCalendarで休日の色を分けたいので調査

Nicke Andersson
The writings of a .NET nut. 
http://nickeandersson.blogs.com/blog/2006/05/_modifying_the_.html

このソースを貼り付けて、クラスを作るとあっさり動いた。
と、思ったけど地雷が多くて一般公開したくない人の気持ちがよくわかった。

例えば、1ヶ月表示でないと、正しい範囲が取得できなくて変になる。
あとはフォントサイズ変えると表示がずれる。

CalendarDimensionsで3x4とかはわかるけど、そこから正確な座標と該当月の取得ロジックを書くのは時間がかかりそうなので断念。このコントロール一杯並べて逃げる。

フォントサイズは9ptと12ptだけ対応した補正を入れて回避。

続きを読む

項目は既に追加されています。辞書のキー: 'System.Object' 追加されるキー: 'System.Object'

WebServiceの非同期メソッドではまったのでメモ

以下のメッセージがでて調査。

項目は既に追加されています。辞書のキー: 'System.Object'  追加されるキー: 'System.Object'

   場所 System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
   場所 System.Collections.Hashtable.Add(Object key, Object value)
   場所 System.Collections.Hashtable.SyncHashtable.Add(Object key, Object value)
   場所 System.Web.Services.Protocols.SoapHttpClientProtocol.InvokeAsync(String methodName, Object[] parameters, SendOrPostCallback callback, Object userState)

コールバック先のメソッドの問題かと思って調べていたが、問題なのは呼出側だった。

修正前:hogeAsync(hoge,null);

修正後:hogeAsync(hoge,Guid.NewGuid());

これで回避。

Web参照で自動生成されるuserStateの引数には、ちゃんと識別可能なものが必要らしい。手抜き禁止。


ついでにlockステートメントを追加すべきか調査した方が良いかも

改訂版 C#入門 第9章 ステートメント
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_009/cs2_009_04.html

バインディング時の書式設定

テキストボックスにバインディングした場合に、3桁区切りや、小数点以下の表示制御などをしたい場合には、Binding.Formatイベントで実現できる。
これはGUIでは設定不可かも。

Binding.Format イベント
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.binding.format(VS.80).aspx

C#のコード例

private void DecimalToCurrencyString(object sender, ConvertEventArgs cevent)
{
   // The method converts only to string type. Test this using the DesiredType.
   if(cevent.DesiredType != typeof(string)) return;

   // Use the ToString method to format the value as currency ("c").
   cevent.Value = *1 return;

   // Converts the string back to decimal using the static Parse method.
   cevent.Value = Decimal.Parse(cevent.Value.ToString(),
   NumberStyles.Currency, null);
}

private void BindControl()
{
   // Creates the binding first. The OrderAmount is a Decimal type.
   Binding b = new Binding
      ("Text", ds, "customers.custToOrders.OrderAmount");
   // Add the delegates to the event.
   b.Format += new ConvertEventHandler(DecimalToCurrencyString);
   b.Parse += new ConvertEventHandler(CurrencyStringToDecimal);
   text1.DataBindings.Add(b);
}

*1:decimal) cevent.Value).ToString("c"); } private void CurrencyStringToDecimal(object sender, ConvertEventArgs cevent) { // The method converts back to decimal type only. if(cevent.DesiredType != typeof(decimal

追記:5年後に同じような症状ではまった。

コーディネータに別サーバーを指定したまま、別サーバが廃棄になったため
MS-DTCが動かなくなった。
コンポーネントサービスのコンピュータ右クリックしてもMS-DTCのメニューが表示されずに困る。
検索したら過去の自分のブログがヒット(w

それでも直らなかったので
以下のリンク先を参考にクリアしたら元に戻った。
http://www.ehow.com/how_7275566_reinstall-ms-dtc.html

わな

コーディネーターの設定は
HKEY_CLASSES_ROOT\CID
に入っているから

一般的な手順によくある
HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC
を削除しただけじゃ、エラーが解除できなかったんだね。

次からはもう怖くないかも

手順抜粋

(関連サービス停止)
net stop msdtc

msdtc.exe -uninstall

(レジストリキー削除)
HKEY_CLASSES_ROOT\CID
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MSDTC
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\MSDTC
HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC

msdtc.exe -install

(HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC\XADLLなければ追加)
regsvr32 mtxoci.dll

msdtc.exe -resetlog

net start msdtc

追記

HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC\XADLL
に以下の追加が必要

文字列値 mtxoci.dll
C:\WINDOWS\system32\mtxoci.dll

追記2

AS400とつなぐときはシステムデータソースでないと動かなかった。
ファイルじゃNG

MS-DTCが動かなくなる

コンポーネントサービスの管理画面で、規定のコーディネーターをいじってるうちに、なにかの拍子にマイコンピュータが停止状態のアイコンになった。

再起動しても復旧せず
コンポーネントサービスの管理画面で、マイコンピュータのプロパティのメニューもサービスの停止のメニューも出てこなくなり編集もできなくなった。

コマンドプロンプト
msdtc -uninstall
msdtc -resetlog
msdtc -install
でも復旧せず

レジストリのLOCALMACHINE_SOFTWARE_MICROSOFT_MSDTCを削除してインストールしても無駄だった。

そのうちmsdtc -install後にイベントログに「MS DTC サービスをインストールできませんでした。」の文字がでてることに気がついた。

別のPCで
LOCALMACHINE_SOFTWARE_MICROSOFT_MSDTCのレジストリの内容を確認し、それと同じ内容にregedt32で編集した。

さらにHKEY_CLASSES_ROOT\CIDでのなかに「HOST」の項目があるので、ここにローカルのIPアドレスを入れて再起動した。

そうしたらコンポーネントサービスの管理画面で、マイコンピュータのプロパティのメニューが復活した。
そこでローカルコンピュータをコーディネータに指定した。
しかし、まだサービスの起動を行うとエラーになる。
そこで
net stop msdtc
msdtc -resetlog

を行い、regedt32でHKEY_CLASSES_ROOT\CIDのHOSTに設定した値をすべて消して空文字にした。
MSDTCのサービスが手動起動になっていたので、自動起動に変更して再起動した。

そしたらマイコンピュータの停止アイコンがとれて正常起動した。
これは心臓に悪い現象だよ…