技術メモ

【C#】Linqで同一名称のデータが何件あるかカウントする

次のようなSampleDataというクラスがあるとする。

public class SampleData
{
    public int Id;
    public string Name;
}

ここでは、SampleDataのNameが同一のデータが何件存在するかをカウントする。

var sampleDataList = new List();
sampleDataList.Add(new SampleData() { Id = 1, Name = "山田" });
sampleDataList.Add(new SampleData() { Id = 2, Name = "田中" });
sampleDataList.Add(new SampleData() { Id = 3, Name = "鈴木" });
sampleDataList.Add(new SampleData() { Id = 4, Name = "山田" });

foreach (var itemCount in sampleDataList.GroupBy(x => x.Name)
                                        .Select(x => new { Name = x.Key, Count = x.Count() }))
{
    Console.WriteLine($"{itemCount.Name} 件数:{itemCount.Count}");
}

実行結果

山田 件数:2
田中 件数:1
鈴木 件数:1

 

 

【C#】CheckBoxのチェックがダブルクリックしないとつかない

(たぶん、遭遇する機会はほとんどないと思う・・・)

WindowsFormに配置したCheckBoxが、シングルクリックしてもチェックがON/OFFにならず、ダブルクリックするとON/OFFできるという現象に遭遇。

原因は、このチェックボックスのMouseDownイベントが実装されていたため、そちらでイベントが処理されてCheckBoxのチェックが変わらなかった。
MouseDownイベントは使っていなかったので、削除したらチェックされるようになった。

 

【SignTool】”Error: SignerSign() failed.” (-2146869243/0x80096005)エラーが発生してコードサイニング証明書を付けることができない(SECTIGO/COMODO)

エラー内容

Done Adding Additional Store
SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2146869243/0x80096005)

エラーが出ないように修正したコマンド

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe" sign /fd sha256 /f %証明書パス% /p %証明書パスワード% /tr http://timestamp.digicert.com /d %アプリ名% %EXEパス%

ポイント:http://timestamp.sectigo.com/rfc3161ではなく、http://timestamp.digicert.comとすればOK

(参考)証明書の検証コマンド

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe" verify /pa "C:\temp\sample.exe"

実行結果

File: C:\temp\sample.exe
Index  Algorithm  Timestamp
========================================
0      sha256     RFC3161

Successfully verified: C:\temp\sample.exe

ポイント

【Visual Studio】フォームのデザイナを開くと「’子’ はこの親の子コントロールではありません。」エラーが発生する

継承元フォームを指定したフォームのデザイナを開いたところ、「’子’ はこの親の子コントロールではありません。」エラーが発生してデザインを変更することができない。

同じフォームを継承した別フォームは開ける。Visual Studioを再起動しても変わらず。

フォームの.Designer.csを開き、以下のような継承元に存在しているコントロールのSetChildIndexの行を削除してみたら、開くことができるようになった。

this.Controls.SetChildIndex(this.LabelTitle, 0);

なぜこうなったかの原因は不明・・・

 

 

【C#】AutoScrollが表示されているか確認する

フォームのAutoScrollを有効にしている場合に、実際にスクロールバーが表示されているかは以下のプロパティで取得できる

//右端のスクロールバーが表示されているか
Console.WriteLine(this.VerticalScroll.Visible);

//下のスクロールバーが表示されているか
Console.WriteLine(this.Horizo​​ntalScroll.Visible);

 

 

 

【VMWare Player】仮想マシンをアップグレードしてくださいと表示され、起動できない

かなり昔のVMWare Playerで作成した仮想マシンを、VMWare Workstation 16 Playerで起動しようとしたところ、以下のエラーメッセージが表示され、起動できなかった。

パワーオン中にエラーが発生しました: 仮想マシンは、このバージョンの VMware Player ではサポートされていないハードウェア バージョンを使用しています。前のバージョンの VMware Player を使用して仮想マシンをアップグレードしてください。

モジュール Upgrade のパワーオンに失敗しました。

仮想マシンの起動に失敗しました。

とりあえず起動させたかったので、拡張子が.vmxのファイルをテキストエディタで開き、「virtualHW.version = “3“」を「virtualHW.version = “18“」(18 = Workstation Player 16.x)に書き換えてみたところ、起動した。
参考ページ

ゲストOS起動時にドライバの再インストールなどが自動で行われたが、特に問題なく使えるようになった。但し、直接バージョンを書き換えて起動させたためにどこかで不具合が出る可能性がある。書き換えて起動させる前に、.vmxファイル以外にもすべてのファイルを別の場所にコピーしてバックアップを行った後に、試した方がよさそう。

 

【C#】フォームのサイズを変更した際に、Paintでうまく描画されない

フォームのPaintイベントで背景などを描画している場合、フォームのサイズを変更した際に、Paintがうまく描画されない場合がある。

この場合、フォームのDoubleBufferedを確認する。Trueになっていれば、Falseにすれば正しく描画されるようになった。

 

【C#】フォーム右下のリサイズ用アイコンを消す

以下の図のような右下に表示されるアイコンを消したい。

表示を消すだけで良ければ、フォームのデザイナから、SizeGripStyleプロパティを「Hide」に設定する。

そもそも、サイズ変更させる必要がない場合は、FormBorderStyleをFixedSingleやFixed3DなどのFixed系にすればこのアイコンは表示されなくなる。

 

【C#】自動で折り返された分を含む行数を取得する

テキストボックスでWordWrapをTrueにしている場合など、右端に来た場合に自動で折り返された際には、もともとの文字列内に存在していた改行数と実際に見える行数が一致しない。

この場合は、RichTextBoxのGetLineFromCharIndexを利用すると実際に表示された行数を取得できる。

richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength);

※例えば、以下の例では文字列中には改行は存在せず、RichTextBoxの幅にあわせて折り返されて見た目は3行だが、GetLineFromCharIndexは2が返ってくる。