DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal画面遷移(モーダルとモードレス)(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | Nomalvb.netでExcelファイル操作(7) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalDrawstringでの透過文字作成(3) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | NomalLoadOptionのパラメータの意味(3) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | NomalCommandBuilderによって作られるCommandTextの内容(5) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) |



■記事リスト / ▼下のスレッド
■34964 / 親記事)  DataGridViewの特定セルにボタンを配置する方法
□投稿者/ り 一般人(4回)-(2021/11/17(Wed) 16:05:58)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    画像のような表を作成したいのですが、
    特定のセルにのみボタンを配置することは可能でしょうか。
548×394 => 250×179
イメージ
IMAGE.png
/6KB
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34965 / ResNo.1)  Re[1]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ 魔界の仮面弁士 大御所(1411回)-(2021/11/17(Wed) 18:12:54)
  • アイコンNo34964に返信(りさんの記事)
    > 画像のような表を作成したいのですが、
    > 特定のセルにのみボタンを配置することは可能でしょうか。

    dataGridView1[0, 0] = new DataGridViewButtonCell { UseColumnTextForButtonValue = true };
違反を報告
引用返信
■34966 / ResNo.2)  Re[2]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ り 一般人(5回)-(2021/11/19(Fri) 08:52:28)
  • アイコンNo34965に返信(魔界の仮面弁士さんの記事)
    > ■No34964に返信(りさんの記事)
    >>画像のような表を作成したいのですが、
    >>特定のセルにのみボタンを配置することは可能でしょうか。
    >
    > dataGridView1[0, 0] = new DataGridViewButtonCell { UseColumnTextForButtonValue = true };

    返信遅くなりました。
    早急に回答していただきありがとうございます!
    しかし、私の理解不足だと思うのですが、これだけでは実現できませんでした。
    他に記述すべき内容がありましたら、教えていただきたいです...
違反を報告
引用返信
■34974 / ResNo.3)  Re[3]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ り 一般人(6回)-(2021/12/06(Mon) 11:35:47)
  • アイコン試行錯誤したらできました。
解決み!
違反を報告
引用返信
■35338 / ResNo.4)  Re[4]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ なかい 一般人(1回)-(2023/01/18(Wed) 20:47:46)
  • アイコンNo34974に返信(りさんの記事)
    > 試行錯誤したらできました。

    お世話様です。
    どのようにして実現できましたのでしょうか?
    同じようなことで試行錯誤しています。
    教えていただけたら、ありがたいです。

違反を報告
引用返信
■35339 / ResNo.5)  Re[5]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ 魔界の仮面弁士 大御所(1521回)-(2023/01/19(Thu) 08:56:36)
  • アイコンNo35338に返信(なかいさんの記事)
    > どのようにして実現できましたのでしょうか?
    > 同じようなことで試行錯誤しています。
    > 教えていただけたら、ありがたいです。

    他者が解決済みとしているスレッドを未解決に戻して質問するのではなく、
    新たなスレッドを立ち上げたうえで、そちらで質問していただけますでしょうか。
    (投稿時に、このスレッドの URL もしくは投稿 No を貼ってもらえると助かります)

    なお、質問する際には
     ・言語指定(VB なのか C# なのか)
     ・Visual Studio のバージョン
     ・現状、どこで問題が起きているのか、あるいは No34965 のどこが分からないか
    などを明記していただけますようお願いします。

    申し訳ありませんが、こちらのスレッドは解決済みに戻させていただきます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35332 / 親記事)  フォームのリサイズ時にDataGridViewが再描画されない
□投稿者/ saku 一般人(6回)-(2023/01/17(Tue) 11:11:25)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    皆さまお世話になります。

    フォーム上に、DataGridViewを配置し、AnchorはTop,Bottom,Left,Rightにしています。データ読み込み後、フォームをドラッグや最大化したときにDataGridView自体はフォームに合わせてサイズは変わるものの、データを表示している部分が再描画してくれません。(This.DataGridView1.Reflesh)

    こういったときはRefleshではなく、他に書き方があるのでしょうか?

    (リサイズ後に、編集中の項目がある場合には操作を全て覚えておいて再読み込みをした後に、順番に処理していく位しか思い浮かびませんでした。)

    皆さまはこういった場面では、どのようにプログラミングしているのでしょうか?
    ヒントだけでもいただければ大変助かります。

    宜しくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35333 / ResNo.1)  Re[1]: フォームのリサイズ時にDataGridViewが再描画されない
□投稿者/ KOZ 一般人(17回)-(2023/01/17(Tue) 11:44:54)
  • アイコンNo35332に返信(sakuさんの記事)

    DataGridView はリサイズすると OnResize メソッドで Invalidate() が実行され再描画されるので、特にコードを書く必要はありません。

    DataGridView.OnResize
    https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewMethods.cs,6dfca71975a9ba17

    「データを表示している部分が再描画してくれません。」とはどのような状態でしょうか?
違反を報告
引用返信
■35334 / ResNo.2)  Re[1]: フォームのリサイズ時にDataGridViewが再描画されない
□投稿者/ 魔界の仮面弁士 大御所(1520回)-(2023/01/17(Tue) 11:47:30)
  • アイコンNo35332に返信(sakuさんの記事)
    > This.DataGridView1.Reflesh
    This → this では?
    DataGridView1 → dataGridView1 では?
    Reflesh → Refresh では?

    ※ fresh:新鮮な
    ※ flesh:肉


    > データを表示している部分が再描画してくれません。
    CellPaiting イベントなどの、何か追加の処理を書いていたりしますか?
    現象を再現可能な、最小実験用のプロジェクトをどこかにアップロードしていただくか、
    あるいは .zip で添付してもらえないでしょうか。
    (サイズを抑えるため、bin や obj などは含めないでください)

    手元の環境で、Form 上に DataGridView を直接貼ったうえで
    下記を試しましたが、事象を再現できませんでした。
    (.NET Framework 4.8.1 および .NET Framework 3.5 で確認)


    var dt = new DataTable();
    for(int i = 1; i <= 15; i++)
    {
      dt.Columns.Add("Col" + i, typeof(int));
    }
    for (int r = 100; r < 200; r++)
    {
      dt.Rows.Add(Enumerable.Range(r + 1, 15).Cast<object>().ToArray());
    }
    dt.AcceptChanges();
    dataGridView1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
    dataGridView1.Columns.Clear();
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = dt;
違反を報告
引用返信
■35335 / ResNo.3)  Re[2]: フォームのリサイズ時にDataGridViewが再描画されない
□投稿者/ saku 一般人(8回)-(2023/01/17(Tue) 13:04:28)
  • アイコン早々のご回答ありがとうございました。
    今回は、既にあるシステム内にDataGridViewのコントロールが既にあり、
    それを継承して使用していました。


    再描画されない状態なのですが、
    フォームの真ん中にDataGridViewを配置、その下にボタンがついています。
    フォームを下にドラッグして、DataGridViewの表示できる行を増やしたところ、
    下に広げた部分は前の表示が残ってしまいます。

    ※外に出せないため、その再描画されない状態だけ画像を添付します。

    説明が下手くそですいません。

    継承したコントロールに問題があるのかもしれません。
    そこだけのプロジェクト作って検証してみます。

    ありがとうございました。



    No35333に返信(KOZさんの記事)
    > ■No35332に返信(sakuさんの記事)
    >
    > DataGridView はリサイズすると OnResize メソッドで Invalidate() が実行され再描画されるので、特にコードを書く必要はありません。
    >
    > DataGridView.OnResize
    > https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewMethods.cs,6dfca71975a9ba17
    >
    > 「データを表示している部分が再描画してくれません。」とはどのような状態でしょうか?
992×315 => 250×79
イメージ
g1117.png
/13KB
違反を報告
引用返信
■35337 / ResNo.4)  Re[3]: フォームのリサイズ時にDataGridViewが再描画されない
□投稿者/ saku 一般人(11回)-(2023/01/17(Tue) 20:16:44)
  • アイコンその後、システム内のプログラムを見直してみました。

    継承コントロールの方でバグが見つかりました。(SuspendLayout、ResumeLayoutの設置位置と削除し忘れ)
    それが原因だったようで、バグ修正後は正しく動くようになりました。

    お手数をおかけしました。
    解決済みとさせていただいます。

    皆さまのご返答で解決の糸口になったこと、感謝します。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35314 / 親記事)  テキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?
□投稿者/ saku 一般人(3回)-(2023/01/04(Wed) 13:18:24)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    こんにちわ。前回は大変お世話になりました。
    また、一つ質問というか疑問がでてきました。

    フォーム上に、テキストボックスを一つあり、ボタンが一つあります。

    テキストボックスで入力後、ボタンを押すのですが、
    テキストボックスのValidatingイベントよりも先に発生するボタンのイベントって
    あるんでしょうか? (少し試してみたのですが、見つかりませんでした。)

    今作成しているものに必要になるかもしれない(必要ないかもしれない)ので、知識として持っておきたいため、お聞きしました。

    あいまいな質問で申し訳ありません。もし、良ければ教えてください。
    よろしくお願いいたします。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35315 / ResNo.1)  Re[1]: テキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?
□投稿者/ Azulean 大御所(536回)-(2023/01/04(Wed) 14:26:41)
  • アイコンNo35314に返信(sakuさんの記事)
    > テキストボックスで入力後、ボタンを押すのですが、
    > テキストボックスのValidatingイベントよりも先に発生するボタンのイベントって
    > あるんでしょうか? (少し試してみたのですが、見つかりませんでした。)


    ないはずです。
    Validating はフォーカスを失うときに発生します。

    1. ボタンを押そうとする
    2. テキストボックスからフォーカスが外れる
    3. Validating/Validated イベント
    4. ボタンがフォーカスを得る
    5. ボタンのクリックイベントが起きる

    こういう流れとなりますので、ボタンクリックしたときだけ Validating の挙動を変えたいみたいなことはできません。


    > 今作成しているものに必要になるかもしれない(必要ないかもしれない)ので、知識として持っておきたいため、お聞きしました。

    必要となるかもしれないのであれば、Validating で検証するという設計・実装を辞めた方が良いと思います。

    Validating は一見、良い考えのように思えるかもしれませんが、「キャンセルするときにもチェックされて手間に感じる」などの弊害もあります。
    このため、OK ボタンなど、適切なタイミングでチェックするように実装することを考えた方が良いでしょう。
違反を報告
引用返信
■35336 / ResNo.2)  Re[2]: テキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?
□投稿者/ saku 一般人(9回)-(2023/01/17(Tue) 13:32:02)
  • アイコンすいません。解決済にするのを失念していました。

    ご返答遅れて申し訳ございません。
    情報ありがとうございました。 管理者の方と仕様変更を含めてお話することにしました。感謝します。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35325 / 親記事)  PDFをフォーム上で表示させる方法につきまして
□投稿者/ 炎の妖精さん 一般人(15回)-(2023/01/16(Mon) 10:19:52)
  • アイコン環境/言語:[Win10(64bit)_VB.NET(Framework 3.5)] 
    分類:[.NET] 

    いつもお世話になっております。

    以前、ご質問させて頂きました件ですが、再度質問させて頂きます(No.35151)
    お手数おかけいたしますm(_ _)m

    Windowsフォーム上にPDFファイルを表示させるにはどんな方法があるのでしょうか?
    @WebBrowerコントール
    AAdobe PDF Readerプラグイン

    @では、PCの環境設定によっては正常に動作したり動作しないことがあるかも知れません。
    当PC環境では、ダウンロードの挙動が発生したり、そもそもPDFが表示されないことがありました。
    AではAdobe Readerをインストールする必要があるので、対象PC全てにインストールするのは手間がかかります。

    なので、
    外部ソフトウェアをインストールせずに
    標準機能でPDFをフォーム上に表示させる方法はありますでしょうか?

    開発環境:Visual Studio 2010 Express
    OSバージョン:20H2(19042.1586)
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35326 / ResNo.1)  Re[1]: PDFをフォーム上で表示させる方法につきまして
□投稿者/ 魔界の仮面弁士 大御所(1517回)-(2023/01/16(Mon) 11:28:52)
  • アイコン2023/01/16(Mon) 11:41:12 編集(投稿者)

    No35325に返信(炎の妖精さんさんの記事)
    > 以前、ご質問させて頂きました件ですが、再度質問させて頂きます(No.35151)
    > Windowsフォーム上にPDFファイルを表示させるにはどんな方法があるのでしょうか?

    No35155 の時のような「標準機能限定」といった制限が無いのなら、PDFium とか。


    OS 自身の機能に限定するなら、WinRT API の Windows.Data.Pdf.PdfPage クラスの
    RenderToStreamAsync メソッドで画像化して表示するという手があるのですが、
    以前も書いた通り、VS2010 では古すぎて呼び出せません。
    https://learn.microsoft.com/ja-jp/uwp/api/windows.data.pdf.pdfdocument?view=winrt-22621
    https://gist.github.com/Benshi/2693d42eb6fbd5ec9601d14845783bd0
違反を報告
引用返信
■35327 / ResNo.2)  Re[2]: PDFをフォーム上で表示させる方法につきまして
□投稿者/ 炎の妖精さん 一般人(17回)-(2023/01/16(Mon) 11:40:02)
  • アイコン魔界の仮面弁士様

    早速のご返信ありがとうございます!

    > 表示だけで良いなら、WinRT API の Windows.Data.Pdf.PdfPage クラスの
    > RenderToStreamAsync メソッドで画像化して表示するという手が
    > あるのですが……流石に VS2010 では古すぎて無理な気がします。
    PDFを単純に表示させると書かせて頂きましたが、
    このPDFは3DPDF(CAD)が描かれており、回転させたり、拡大縮小などが出来るファイルとなっております。
    それらの機能は活かしたいので画像化するとそれらの機能は使えないと思います。
    現実的にはAdobe Readerをインストールして、内部に組み込む法がベストかなと思っております。

違反を報告
引用返信
■35328 / ResNo.3)  Re[3]: PDFをフォーム上で表示させる方法につきまして
□投稿者/ 魔界の仮面弁士 大御所(1518回)-(2023/01/16(Mon) 11:52:39)
  • アイコン2023/01/16(Mon) 12:00:17 編集(投稿者)

    No35327に返信(炎の妖精さんさんの記事)
    > 現実的にはAdobe Readerをインストールして、内部に組み込む法がベストかなと思っております。

    3DPDF というものは初めて聞いたのですが、3D CAD の表示であれば
    HTML コンテンツに埋め込める Web サービス(Sketchfab) なビューワーが
    あるようです。ただ、Edge WebView2 コントロールを埋め込む方法だと
    .NET Framework 4.5 以降が対象なので、やっぱり VS2010 では使えないという罠。

    Adobe Reader では無いですが、
    Acrobat SDK でできるかどうか、といったところ。(要件を満たせるかは不明)
    https://opensource.adobe.com/dc-acrobat-sdk-docs/acrobatsdk/
    https://qiita.com/ANNEX_IBS/items/f7eb7b795915d204a079


    ところで、何故未だに Visual Studio 2010 を使い続けているのでしょうか?
    デメリットの方が勝るように思うのですが。
違反を報告
引用返信
■35329 / ResNo.4)  Re[4]: PDFをフォーム上で表示させる方法につきまして
□投稿者/ 炎の妖精さん 一般人(18回)-(2023/01/16(Mon) 12:12:57)
  • アイコン魔界の仮面弁士様

    早速のご返信ありがとうございます!
    本当に感謝です!


    > 3DPDF というものは初めて聞いたのですが、調べてみると
    > HTML コンテンツに埋め込める Web サービス(Sketchfab) なビューワーが
    > あるようです。ただ、Edge WebView2 コントロールを埋め込む方法だと
    > .NET Framework 4.5 以降が対象なので、やっぱり VS2010 では使えないという罠。
    VS2010では.NET4.0までが使用できますので、上記プラグインでは出来ないようです。


    > Adobe Reader では無いですが、
    > Acrobat SDK でできるかどうか、といったところ。(要件を満たせるかは不明)
    Adobe製でかつ開発キットなので確認するには十分です。参考とさせて頂きます。


    > ところで、何故未だに Visual Studio 2010 を使い続けているのでしょうか?
    > デメリットの方が勝るように思うのですが。
    此度の件とは別の開発については、VS2010で十分に事足りていますので
    新バージョンのVisual Studioをインストールするのは見送っております。
    もちろん、新バージョンが圧倒的に使いやすく便利だということは承知してますが(旧、新バージョンとの比較、違いは正味、あまり分かっておりません…)

    すごく参考になりましたので
    後は調べながら要件満たせるか確認したいと思いますので
    本件は解決とさせて頂きます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▲上のスレッド
■35216 / 親記事)  DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ たこ 一般人(12回)-(2022/11/04(Fri) 02:12:28)
  • アイコン環境/言語:[Windows10 VB.NET .NET Framework 4.7.2 VS2019] 
    分類:[.NET] 

    いつもお世話になります。

    DataGridViewの行ヘッダーに行番号を表示する
    https://dobon.net/vb/dotnet/datagridview/drawrownumber.html

    を使わせて頂いておりますが、1つ目のデータを挿入した際に「System.Configuration.ConfigurationErrorsException: '構成システムを初期化できませんでした。'」と出て停止してしまいます。
    (2つ目のデータ以降はエラーが出ない)
    「例外設定」の「次からスローされた場合を除く」の項目に「Log.dll」とあるので、ログクラスが何かしらいたずらしているとは思うのです。

    何か解決の糸口は無いかと書込みさせて頂きます。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
      '列ヘッダーかどうか調べる
        If e.ColumnIndex < 0 And e.RowIndex >= 0 Then
          'セルを描画する
          e.Paint(e.ClipBounds, DataGridViewPaintParts.All)       '←ここで発生 コメントアウトするとフォーム拡大縮小時にゴミが残る…

          '行番号を描画する範囲を決定する
          'e.AdvancedBorderStyleやe.CellStyle.Paddingは無視しています
          Dim indexRect As Rectangle = e.CellBounds
          indexRect.Inflate(-2, -2)
          '行番号を描画する
          TextRenderer.DrawText(e.Graphics,
                    (e.RowIndex + 1).ToString(),
                    e.CellStyle.Font,
                    indexRect,
                    e.CellStyle.ForeColor,
                    TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)
          '描画が完了したことを知らせる
          e.Handled = True
        End If

        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------



    呼出し元
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Private Sub DGVDataAdd(workStr As List(Of String()))
        DataGridView1.Rows.Clear()
        On Error GoTo ErrorNext
        System.Threading.Monitor.Enter(workStr)
        Dim ws As List(Of String()) = workStr
        System.Threading.Monitor.Exit(workStr)
        System.Threading.Monitor.Enter(ws)
        Dim x As Integer = 0
        For Each work In ws
          System.Threading.Monitor.Enter(work)
          DataGridView1.Rows.Add(work)
          DataGridView1(LogData.LogKinds, x).Style.BackColor = LogKind_ColorChange(work)
          DataGridView1(LogData.Operation, x).Style.ForeColor = Operation_ColorChange(work)
          x += 1
          System.Threading.Monitor.Exit(work)
        Next
        System.Threading.Monitor.Exit(ws)
    ErrorNext:
        DataGridView1.Refresh()
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;



    呼出し元の呼出し元
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Private Delegate Sub DGVAddInvoke(DataStr As List(Of String()))

      ''' <summary>
      ''' AlertLog変更イベント
      ''' </summary>
      Private Sub _LogStock__AlartLogEvent(sender As Object, e As EventArgs) Handles _LogStock._AlertLogEvent
        If DispLevel = LogEventArgs.Kinds.Alart Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.AlertLog)
        End If
      End Sub

      ''' <summary>
      ''' OperateLog変更イベント
      ''' </summary>
      Private Sub _LogStock__OperateLogEvent(sender As Object, e As EventArgs) Handles _LogStock._OperateLogEvent
        If DispLevel = LogEventArgs.Kinds.Operate Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.OperateLog)
        End If
      End Sub

      ''' <summary>
      ''' SystemLog変更イベント
      ''' </summary>
      Private Sub _LogStock__SystemLogEvent(sender As Object, e As EventArgs) Handles _LogStock._SystemLogEvent
        If DispLevel = LogEventArgs.Kinds.System Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.SystemLog)
        End If
      End Sub

      ''' <summary>
      ''' DebugLog変更イベント
      ''' </summary>
      Private Sub _LogStock__DebugLogEvent(sender As Object, e As EventArgs) Handles _LogStock._DebugLogEvent
        If DispLevel = LogEventArgs.Kinds.Debug Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.DebugLog)
        End If
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    以上3つのメソッドはLogDispクラスで、イベントはLogクラスから飛んできます。



    Logクラス
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Public Delegate Sub LogEventHandler(sender As Object, e As EventArgs)
      Public Event _AlertLogEvent As LogEventHandler
      Public Event _OperateLogEvent As LogEventHandler
      Public Event _SystemLogEvent As LogEventHandler
      Public Event _DebugLogEvent As LogEventHandler

      Private _AlertLog As New List(Of String())
      Private _OperateLog As New List(Of String())
      Private _SystemLog As New List(Of String())
      Private _DebugLog As New List(Of String())


      Public Sub Write(sender As Object, e As LogEventArgs)

        〜〜〜 (中略) 〜〜〜

        If e.LogKinds = LogEventArgs.Kinds.System Then
          _DebugLog.Insert(0, WriteData.Split(","))
          _SystemLog.Insert(0, WriteData.Split(","))
          If _SystemLog.Count > _MaxDispLog Then _SystemLog.RemoveAt(_MaxDispLog)
          RaiseEvent _SystemLogEvent(Me, New EventArgs())
          RaiseEvent _DebugLogEvent(Me, New EventArgs())
          Exit Sub
        End If
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    LogクラスもDispLogも同じLogプロジェクト内で、クラスライブラリ
    DispLogはユーザーコントロールです。

    よろしくお願いします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35218 / ResNo.1)  Re[1]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1475回)-(2022/11/04(Fri) 10:44:35)
  • アイコンNo35216に返信(たこさんの記事)
    >「System.Configuration.ConfigurationErrorsException: '構成システムを初期化できませんでした。'」
    プログラムそのものでは無く、アプリケーション構成ファイルである
    exe名.config (開発時は app.config) ファイル、あるいは user.config の
    内容に不整合や破損があると、その例外が発生します。
    user.config の場所についてはこちら。
    https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html


    ということで、ログ関連の設定情報に問題があるのでは無いでしょうか。

    プロジェクトの構成が分からないので具体的なアドバイスはできませんが、
    Log.dll のプロジェクトがあるのなら、確認すべき app.config は Log プロジェクトの app.config ではなく、
    exe 側のプロジェクト側の app.cofing のはずです。exe 側の .config に対して、Log プロジェクト用の
    エントリーが正しく記録されているかどうかを確認してみてください。


    > LogクラスもDispLogも同じLogプロジェクト内で、クラスライブラリ
    > DispLogはユーザーコントロールです。
    NLog や log4net の類では無く、自作のロギングクラスということだとすると、
    第三者には、具体的なアドバイスが難しいかもしれません。


    > 呼出し元
    > Private Sub DGVDataAdd(workStr As List(Of String()))
    >   DataGridView1.Rows.Clear()
    >   On Error GoTo ErrorNext
    DataGridView1.Rows.Clear() が呼ばれているという事は、DGVDataAdd メソッドの呼び出し元が
    UI スレッド上からの呼び出しであることは保証されているのですよね?

    で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。


    > いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;
    え?「いろんなスレッドに呼ばれる」のですか?
    この実装だと、UI スレッド以外からの呼び出しは NG に見えますが…。

    ワーカースレッドから呼ばれることを前提としているのであれば、
    DataGridView に対する読み書き部分を取り除く必要があるでしょう。


    >   System.Threading.Monitor.Enter(workStr)
    >   Dim ws As List(Of String()) = workStr
    >   System.Threading.Monitor.Exit(workStr)
    >   System.Threading.Monitor.Enter(ws)
    ・ws は、workStr のコピーでは無く、同一インスタンスへの参照ですよね。
     Exit 直後に再 Enterをする実装になっているのは何故ですか?
     ループ全体を ws で囲って、ループ内では workStr で囲っている理由が分からないです。
     (ReaderWriterLock クラスのような事がしたいわけでも無さそうですし…)

    ・もしも処理によって粒度の異なるロックを用意したいという意図であれば、
     ロック範囲のレベルごとに、別々の「Object インスタンス」を設けた方が良いかもしれません。
      Private ReadOnly lockObject As New Object()

    ・UI スレッドで Monitor を扱う場合は、無制限待機になってしまうことを避けるため、
     .Enter ではなく、待機上限時間を指定可能な .TryEnter の方が安全かと思います。
     (ロック失敗時にアプリケーション例外とするのか、処理を無視するのか、リトライ判定させるかは要件次第…)
違反を報告
引用返信
■35219 / ResNo.2)  Re[2]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ たこ 一般人(14回)-(2022/11/04(Fri) 22:14:40)
  • アイコンNo35218に返信(魔界の仮面弁士さんの記事)
    > ■No35216に返信(たこさんの記事)

    いつもお世話になります。
    魔界の仮面弁士様、早速のご回答ありがとうございます。



    > ということで、ログ関連の設定情報に問題があるのでは無いでしょうか。
    >
    > プロジェクトの構成が分からないので具体的なアドバイスはできませんが、
    > Log.dll のプロジェクトがあるのなら、確認すべき app.config は Log プロジェクトの app.config ではなく、
    > exe 側のプロジェクト側の app.cofing のはずです。exe 側の .config に対して、Log プロジェクト用の
    > エントリーが正しく記録されているかどうかを確認してみてください。


    exe側のApp.config
    ----------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
    </configuration>
    ----------------------------------------------------------------------------------------------------
    別におかしいところは見当たらず…orz




    > DataGridView1.Rows.Clear() が呼ばれているという事は、DGVDataAdd メソッドの呼び出し元が
    > UI スレッド上からの呼び出しであることは保証されているのですよね?


    InvokeでUIスレッド上からの呼び出しであることは保証されている…と思っています。。。



    > で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。


    はい。値渡ししています。


    >>いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;
    > え?「いろんなスレッドに呼ばれる」のですか?
    > この実装だと、UI スレッド以外からの呼び出しは NG に見えますが…。


    正確にはいろいろなクラスのメソッドからイベントで呼ばれる…でした^^;



    > ワーカースレッドから呼ばれることを前提としているのであれば、
    > DataGridView に対する読み書き部分を取り除く必要があるでしょう。
    >
    >
    >>  System.Threading.Monitor.Enter(workStr)
    >>  Dim ws As List(Of String()) = workStr
    >>  System.Threading.Monitor.Exit(workStr)
    >>  System.Threading.Monitor.Enter(ws)
    > ・ws は、workStr のコピーでは無く、同一インスタンスへの参照ですよね。
    >  Exit 直後に再 Enterをする実装になっているのは何故ですか?
    >  ループ全体を ws で囲って、ループ内では workStr で囲っている理由が分からないです。
    >  (ReaderWriterLock クラスのような事がしたいわけでも無さそうですし…)
    >
    > ・もしも処理によって粒度の異なるロックを用意したいという意図であれば、
    >  ロック範囲のレベルごとに、別々の「Object インスタンス」を設けた方が良いかもしれません。
    >   Private ReadOnly lockObject As New Object()
    >
    > ・UI スレッドで Monitor を扱う場合は、無制限待機になってしまうことを避けるため、
    >  .Enter ではなく、待機上限時間を指定可能な .TryEnter の方が安全かと思います。
    >  (ロック失敗時にアプリケーション例外とするのか、処理を無視するのか、リトライ判定させるかは要件次第…)


    TryEnterと言うメソッドもあるのですね…
    まだまだスレッドとエラー処理については勉強が必要そうです……


    で、本題の「DataGridViewの行ヘッダーに行番号を表示した時のエラー」について、今回はそこまで厳密にリアルタイムに表示されなくても良い為、
    魔法の言葉「On Error Resume Next」で逃げる事にしました^^;

    最終形
    -----------------------------------------------------------------------------------------------------------------------------------------------------
      Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        On Error Resume Next
        '列ヘッダーかどうか調べる
        If e.ColumnIndex < 0 And e.RowIndex >= 0 Then
          'セルを描画する
          e.Paint(e.ClipBounds, DataGridViewPaintParts.All)

          '行番号を描画する範囲を決定する
          'e.AdvancedBorderStyleやe.CellStyle.Paddingは無視しています
          Dim indexRect As Rectangle = e.CellBounds
          indexRect.Inflate(-2, -2)
          '行番号を描画する
          TextRenderer.DrawText(e.Graphics,
                     (e.RowIndex + 1).ToString(),
                     e.CellStyle.Font,
                     indexRect,
     e.CellStyle.ForeColor,
                     TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)
          '描画が完了したことを知らせる
          e.Handled = True
        End If

        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
      End Sub


      Private Sub DGVDataAdd(workStr As List(Of String()))
        DataGridView1.Rows.Clear()
        On Error GoTo ErrorNext
        Dim ws As List(Of String()) = workStr
        Dim x As Integer = 0
        For Each work In ws
          DataGridView1.Rows.Add(work)
          DataGridView1(LogData.LogKinds, x).Style.BackColor = LogKind_ColorChange(work)
          DataGridView1(LogData.Operation, x).Style.ForeColor = Operation_ColorChange(work)
          x += 1
        Next
    ErrorNext:
        DataGridView1.Refresh()
      End Sub

    -----------------------------------------------------------------------------------------------------------------------------------------------------


    板汚し失礼致しました。
    またよろしくお願い致します。
    ありがとうございました。
解決み!
違反を報告
引用返信
■35220 / ResNo.3)  Re[3]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1476回)-(2022/11/07(Mon) 17:05:33)
  • アイコンNo35219に返信(たこさんの記事)
    >> あるいは user.config の内容に不整合や破損があると、
    > exe側のApp.config
    > 別におかしいところは見当たらず…orz
    user.config や machine.config は大丈夫なのですね?
    https://ja.stackoverflow.com/questions/65632/%E6%A7%8B%E6%88%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6


    また、exe 側は .config 設定が特に無いものの、
    dll 側では connectionStrings や applicationSettings を
    登録してある…という事も無いのですよね。

    とすると、Invoke のタイミングの問題?


    > 正確にはいろいろなクラスのメソッドからイベントで呼ばれる…でした^^;
    常に Invoke であれば「いろんなスレッドに呼ばれる」ことはなく、
    UI スレッドからの呼び出しであると言えそうですが、Invoke し忘れが怖い所。

    呼び出し元の使い方を保証できない場合は、InvokeRequired を使って
    「別スレッドから呼び出された場合は、自身を Invoke しなおす」という
    実装にする手法があります。
    https://atmarkit.itmedia.co.jp/ait/articles/0506/17/news111.html#:~:text=invokeメソット&#12441;か&#12441;必要かと&#12441;うか

    いずれにせよ、イベント再入などが起こらないように注意が必要です。
    フォームを閉じている最中や起動途中に、割り込まれて Invoke されるような
    ケースがありえる場合は、追加の保護機構が必要になるかもしれません。


    >>で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。
    > はい。値渡ししています。
    ロギングのため、追記される差分情報のみを同期的に渡すのであれば、
    同一インスタンスでは無く、値のコピーを渡す方が簡単だったりします。
    同一インスタンスへの同時書き込みが発生しなくなるので、
    Monitor や SyncLock などによる同期制御が不要で、Invoke だけで済むかと。
解決み!
違反を報告
引用返信
■35313 / ResNo.4)  Re[4]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ Aurea 一般人(1回)-(2023/01/04(Wed) 10:41:25)
  • アイコンコメントにあるものはもう試しましたか?最初のコメントは、実際に試してみればうまくいく可能性が高いと思います。私は自分でそれを実行しましたが、これまでのところ良い結果が得られました。これが、コードについて検討できるさまざまな状況が実際にたくさんあると言える理由です。それが私が最初に言えることであり、あなたと私は両方とも、現時点で私たち全員が検討できる選択肢がほとんどないことを知っています.今あなたがしなければならないことは、今のところ私たち全員が得ることができる最善の回答を考え出すことです.
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]






Mode/  Pass/


- Child Tree -

2024/03/29(Fri) 04:24:13 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする