‘COM 参照可能なマネージ クラス ‘ComboBoxUiaProvider’ のクラス インターフェイスを要求する…

Posted by muchag | C# |
初回投稿:2019-09-23 (月) 18:45:30 | 最終更新:2019-09-24 (火) 13:04:41

コンストラクタをクラス名と同じにしたら
エラーになって焦った。

【環境】
C#: 8.0
Visual Studio: 16.2.5(2019C)
エラー

ComboBox へ DataSource を設定していたら、下記エラーメッセージと遭遇した。

マネージド デバッグ アシスタント ‘NonComVisibleBaseClass’ :
‘COM 参照可能なマネージ クラス ‘ComboBoxUiaProvider’ のクラス インターフェイスを要求する QueryInterface 呼び出しが行われましたが、
このクラスは COM 参照可能ではないクラス ‘ComboBoxExAccessibleObject’ から派生しているため、
QueryInterface は失敗します。
これは、COM 参照可能ではない基本クラスが COM バージョン管理規則によって制約されるのを防ぐためです。’
状況
Visual Studio

Visual Studio からは、「例外がスローされました」というメッセージを受け取ったけど
Exception の種類は不明。

try .. catch で、Exception を拾おうとしても、拾えない。

ロジック

コンボボックスの選択肢が、ユーザの操作状況によって変化するので
その度に、ComboBox.DataSource を設定し直す、というもの。


ComboBox1.DataSource = Items; // ここで例外
ComboBox1.DisplayMember = "ItemDisp";
ComboBox1.ValueMember = "ItemValue";

同じコードで DataSource を変更している
他の ComboBox ではこれで問題ないのに、ここだけ上記エラーとなる。

原因

nonComVisibleBaseClass MDA

解決?

原因は、上記なんだろうけど、
どうしていいかわからないので
デバッグ最中に出てくる
画面右下のペイン [例外設定] にて
[Managed Debugging Assistants]-[NonComVisibleBaseClass] のチェックを外した。

Posted by muchag | C# |
初回投稿:2019-09-23 (月) 18:45:30 | 最終更新:2019-09-24 (火) 13:04:41

NullReferenceException

Posted by muchag | C#,Library & PlugIn & AddIn |
初回投稿:2018-03-22 (木) 21:29:17 | 最終更新:2018-03-22 (木) 21:38:32

【環境】
NPOI: 2.3.0
Visual C#: 15.5.4(2017)
.NETFramework,Version: v4.6.1
経緯

ある日突然例外がスローされた。

System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

見てみると、どうやら GetRow で失敗しているんだけど
何故か、22行目で突然失敗。

原因

CreateRow や CreateCell をしておらず
その行やセルが見つからない、ってことだったみたい。
stack overflow:NullReferenceException accessing Workbook Cells with NPOI(2016-10-23)

これが、一から作成してる Excel ファイルではなく
テンプレートファイルを用意していたので
ちょっと混乱した。

7行目から先は全て空白行なので
21行目も22行目もどちらも空白行なのに
22行目で突然エラー。

解決(邪道)

どうやら、21行目までは見た目空白行であっても
書式設定か何かがされていて、NPOI 側で既存と認識できていたみたい。

なので、100行目までフォント色を「自動」にしたら
例外にならなくなった。

本当は CreateRow や CreateCell をするのが正しい解決方法だと思うけど
今晩は時間がないので暫定で対応。

Posted by muchag | C#,Library & PlugIn & AddIn |
初回投稿:2018-03-22 (木) 21:29:17 | 最終更新:2018-03-22 (木) 21:38:32

DateTime

Posted by muchag | C# |
初回投稿:2018-02-11 (日) 12:23:12 | 最終更新:2018-02-11 (日) 12:28:15


MSDN:DateTime 構造体
MSDN:DateTime 演算子
MSDN:DateTimeOffset 構造体

【環境】
Visual C#: 15.5.4(2017)
文字列変換

dobon.net:日時(DateTimeオブジェクト)を文字列に変換する

Posted by muchag | C# |
初回投稿:2018-02-11 (日) 12:23:12 | 最終更新:2018-02-11 (日) 12:28:15

双方向データバインド

Posted by muchag | C# |
初回投稿:2018-02-11 (日) 12:21:07 | 最終更新:2019-12-17 (火) 21:18:59

【環境】
.NET Framwork: 4.5
Visual Studio: 2019C 16.4.1
前提

今回は、VB 案件で試したので、VB で。

本体プロジェクト(Windows フォームアプリ)とは別に
ユーザコントロール用クラスライブラリプロジェクトを作成。
(以下、コントロールプロジェクト)

手順
コントロールデザイン

コントロールプロジェクトを新規作成。

デフォルトで用意されたファイルに、テキストボックスなどを配置。

データバインディング用クラスを作成

Public Class ProfileEntity
    Public Property FirstName() As String = ""
    Public Property FamilyName() As String = ""
    Public Property Age() As Integer = 0
    Public Property Gender() As Integer = 0
End Class

そして、性別ラジオボタンのデータバインディングをどうすればよいか
と考えたら、全然思いつかなかった。

Google 先生にも質問してみたけど
ドンピシャの回答は得られなかった。

今後の課題。

バインディング
  1. [データソース] ビューで、[新しいデータソースの追加]
  2. 「データソースの種類の選択」ダイアログ
    1. [オブジェクト] を選択
    2. [次へ]
  3. 「データ オブジェクトの選択」ダイアログ
    1. ツリーを開いて、対象オブジェクトにチェック
    2. [完了]
  4. コントロールデザインへ、DataSource コントロールを配置
    1. DataSource コントロールの DataSource プロパティから
      1. [他のデータソース]-[プロジェクト データソース]-[(先程登録したオブジェクト)]
  5. フォーム上の各コントロールの (DataBindings) の対象プロパティへ、オブジェクトプロパティをバインディング
    1. ComboBox:SelectedValue プロパティ?
    2. TextBox:Text プロパティ
  6. ソースへデータオブジェクトのインスタンスを、DataSource へ設定するメソッドを追加

Public Sub SetDataSource(ByVal profile As ProfileEntity)
    Me.DataSource1.DataSource = profile
End Sub

試行錯誤に書いた通り、DataSource プロパティを外から設定することはできない。

フォーム利用
  1. コントロールプロジェクトをビルド
  2. 本体プロジェクトを新規作成
  3. 本体プロジェクト内の [参照] のコンテキストメニューから [参照の追加]
  4. 「参照マネージャー」ダイアログ
    1. [参照] から、コントロールプロジェクトの .dll を選択
  5. コントロール追加 の手順でツールボックスへ自作コントロールを追加
  6. 自作コントロールを、ツールボックスからフォームへ D&D
参考サイト

MSDN:とあるコンサルタントのつぶやき Part 1. 双方向データバインドの基本的な使い方(2009-02-26)
→とてもわかりやすい解説

@IT:WPF/UWP:ラジオボタンを双方向バインディングするには?[C#/VB](2016-02-03)
→ラジオボタンにおける双方向データバインド

試行錯誤
ユーザコントロールクラスを作成

UserControl クラスを継承するのに、下記のように書いたら

ステートメントの終わりを指定してください。

と怒られた。


Public Class ProfileControl Inherits UserControl

End Class

これが正解。


Public Class ProfileControl
    Inherits UserControl

End Class
データバインディング用クラスを作成
メンバ変数

メンバ変数ではダメ。

これでは、データバインディングのときに
選択肢として出てこなかった。

Public Class ProfileEntity
    Public FirstName As String = ""
End Class
古い記述

プロパティとして宣言すれば問題なかった。

けど、これは古い書き方らしい。


Public Class ProfileEntity
    Private _firstName As String = ""
    Public Property FirstName() As String
        Get
            Return _firstName
        End Get
        Set(value As String)
            _firstName = value
        End Set
    End Property
End Class
DataSource 設定

コントロールを利用するフォーム側で DataSource を設定しようとしたら
できなかった。

なので、コントロール側に、DataSource を設定するメソッドを追加した。

Posted by muchag | C# |
初回投稿:2018-02-11 (日) 12:21:07 | 最終更新:2019-12-17 (火) 21:18:59

LINQ -> Where

Posted by muchag | C# |
初回投稿:2018-02-08 (木) 10:54:02 | 最終更新:2018-02-11 (日) 12:16:10

【環境】
Visual C#: 15.5.4(2017)
OR

if 文と同じように書けば良い。


.Where(x => x == 1 || x => x == 2)
動的に生成

C#erの備忘録:Linqの動的条件生成ライブラリ(2013-02-16)
→ありがたくライブラリを使わせていただいたけど、期待通りには動かなかった。


var condition = ConditionChain.Create(condition1).OrElse(condition2);

ここで、null になっちゃったんだったっけか。。。

Posted by muchag | C# |
初回投稿:2018-02-08 (木) 10:54:02 | 最終更新:2018-02-11 (日) 12:16:10

Database operation expected to affect 1 row(s) but actually affected 0 row(s).

Posted by muchag | C# |
初回投稿:2018-02-06 (火) 0:12:26 | 最終更新:2018-02-06 (火) 0:17:58

【環境】
Visual C#: 15.5.4(2017)
経緯

SQLite3 で管理しているデータを削除しようとしたら
下記エラーが出た。

{“Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.”} Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException

データが既に更新またや削除されているよ。。。って、誰よ~TT

原因

データベースに格納されている日付文字列が「2018-02-05」となっていたため
DateTime 型で値を持っている C# では「2018-02-05 00:00:00」となり
整合性が取れなくなっていたみたい。

解決

データベース側の値を「2018-02-05 00:00:00」とすることで
エラーは出なくなった。

愚痴

そもそも SQLite のデータ型に DateTime がないから・・・。
ん~なんで、初期データを「2018-02-05」しちゃったんだろう。。。
私がアホなだけよね。。。

Posted by muchag | C# |
初回投稿:2018-02-06 (火) 0:12:26 | 最終更新:2018-02-06 (火) 0:17:58

ハッシュ値

Posted by muchag | C# |
初回投稿:2018-01-28 (日) 22:27:38 | 最終更新:2018-01-28 (日) 22:32:33

暗号化って、全然勉強できてないな~。
今回はまずは序章ということで、参考サイトのまんま実装してみる。
何かの記事に書いてあったけど、もう MD5 はやばいそうな。

「せめて 256 バイト以上のものを利用しましょう」とあったので
試してみた。

【環境】
Visual C#: 15.5.4(2017)
SHA256

行け!偏差値40プログラマー:[ C# ] SHA256 で文字列のハッシュ値を計算・取得する


// 文字列のハッシュ値(SHA256)を計算・取得する
protected string _GetHashedTextString(string passwd)
{
    // パスワードをUTF-8エンコードでバイト配列として取り出す
    byte[] byteValues = Encoding.UTF8.GetBytes(passwd);
 
    // SHA256のハッシュ値を計算する
    SHA256 crypto256 = new SHA256CryptoServiceProvider();
    byte[] hash256Value = crypto256.ComputeHash(byteValues);
         
    // SHA256の計算結果をUTF8で文字列として取り出す
    StringBuilder hashedText = new StringBuilder();
    for (int i = 0; i < hash256Value.Length; i++)
    {
        // 16進の数値を文字列として取り出す
        hashedText.AppendFormat("{0:X2}", hash256Value[i]);
    }
    return hashedText.ToString().ToLower();
}

ほぼ、上記サイトからいただいてきたんだけど
18行目だけ。

そもそものハッシュ値を、
Good-Tool.net:ハッシュ値の一括計算・生成ツール(無料)
で生成したため、ToLower だけ追加した。

Posted by muchag | C# |
初回投稿:2018-01-28 (日) 22:27:38 | 最終更新:2018-01-28 (日) 22:32:33

「OK」「キャンセル」

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 20:28:51 | 最終更新:2018-01-28 (日) 22:40:07

フォームの「OK」「キャンセル」ボタンのお話。

【環境】
Visual C#: 15.5.4(2017)
キー連動

フォーム表に配置したボタンに「OK」「キャンセル」の挙動を持たせる。
=Enter 押下で反応する「OK」ボタン、ECS 押下で反応する「キャンセル」ボタン。

フォームのプロパティ
AcceptButton:「OK」の挙動をするボタンの Name を設定
CancelButton:「キャンセル」の挙動をするボタンの Name を設定

手書き

下記のように手書きして、Form の Key_Down イベントへ登録する手もある。


private void Login_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
    }
    else if (e.KeyCode == Keys.Cancel)
    {
    }
}
値の受け渡し

値の受け渡し

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 20:28:51 | 最終更新:2018-01-28 (日) 22:40:07

アプリケーション設定

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 18:47:49 | 最終更新:2018-01-28 (日) 23:22:14

アプリケーション内の設定のこと。
preference の方が区別が付くかも?

この話、どこかの記事に書いた気がするんだけど
見つけられないので、改めて記述。

【環境】
Visual C#: 15.5.4(2017)
入れ物

プロジェクトのコンテキストメニュー [プロパティ] 左ペイン [設定]

こちらの画面で、1つずつ下記を設定していく。
名前:設定値の名称。任意。プログラム内で使用するので、アルファベットで設定してね
種類:設定値のデータ型
スコープ:
アプリケーション:全ユーザー統一
ユーザー:ユーザー毎
値:値

利用

// 取得
txtUsername.Text = Properties.Settings.Default.LoginUsername;
Properties.Settings.Default.Save();

// 設定
Properties.Settings.Default.LoginUsername = "username";
保存場所

ユーザー設定は、ユーザーの非表示のローカル アプリケーション データ フォルダーのサブフォルダー内のファイルに保存されます。

MSDN:方法 : 実行時にユーザー設定を C# で書き込む

というわけで、SQLite -> 導入 にも書いた通り

C:\Users\[user_name]\AppData\Local\Packages\(おそらくランダム文字列)\LocalState

にあるみたいだけど、上記記事は UWP の場合なわけで
フォームアプリケーションの場合は、パッケージ ID をどこで見ればいいのかしらね~。

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-28 (日) 18:47:49 | 最終更新:2018-01-28 (日) 23:22:14

Form -> 継承

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 23:16:41 | 最終更新:2019-09-23 (月) 16:40:37

【環境】
Visual C#: 16.2.5(2019C)
基本

フォームの継承は、めんどいルールがあった気がする。
勉強したときに、メモし忘れたらしい。

とりあえず、久しぶりにフォームを継承してみて
ルールを忘れていたせいで、エライことになった。
強制終了 -> フォームの継承

継承ルールを再度勉強しないと。。。

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 23:16:41 | 最終更新:2019-09-23 (月) 16:40:37
次ページへ »