【C#】オブジェクト グラフを Null にすることはできません。エラーが発生する

エラー内容

System.ArgumentNullException: オブジェクト グラフを Null にすることはできません。
パラメーター名:graph
   場所 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   場所 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)

原因

BinaryFormatterのSerialize()の第2引数に渡す値がnullだった。。。
エラーメッセージが分かりにくかったのでメモ。

 

【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);

 

 

 

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

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

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

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

 

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

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

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

richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength);

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

 

【C#】コントロールの位置を計算して画面中央に表示させる

以下のように、LeftとTopを変更すればOK

//横軸の中央に移動させる
control.Left = (this.ClientSize.Width - control.Width) / 2;

//縦軸の中央に移動させる
control.Top = (this.ClientSize.Height - control.Height) / 2;

※this.Widthやthis.Heightを使うと計算しても中央にならないので、this.ClientSize.Widthとthis.ClientSize.Heightを利用すること

 

【C#】DateTimePickerで日付と曜日を表示する

DateTimePickerの表示形式にて、「2022/02/21 月」のように日付と曜日を表示させることができる。

コントロールのプロパティで、Formatを「Custom」にし、CustomFormatを「yyyy/MM/dd ddd」と変更する。
※FormatをCustomに変更しないと、反映されないので注意!

yyyy/MM/dd ddd とすると、以下の表示になる。

yyyy/MM/dd dddd とすると、以下の表示になる。