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

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

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



■記事リスト / ▼下のスレッド
■35467 / 親記事)  TabPageの背景色
□投稿者/ くるり 一般人(1回)-(2023/07/08(Sat) 22:40:02)
  • アイコン環境/言語:[.NET Framework 4.8 , Windows11 , VB.Net] 
    分類:[.NET] 

    お世話になっています。

    TabPageにTextboxを設置し、背景色(BackColor)をTabPageと同色にしようと試みていますが、TabPageの背景色初期値がTransparentのため、Textboxの背景色には設定できません。
    TabPageの親コントロールであるTabControlにはそもそも背景色を設定するプロパティはなく、かといって、Formの背景色ともTabPageの背景色は異なります。

    イメージとしては、ファイルなどのプロパティにある編集不可のTextboxのように親コントロールと同色のReadonlyのTextboxを設置したいのですが、何か良い方法はあるでしょうか。
    (Labelコントールは、テキストを選択できないのでNG)

    最後の手段としては、TabPageの背景色である#F9F9F9を直接指定しようと思いますが、コントロールの色や形状はOSのバージョンに依存するので、できれば、TabPageと同色の背景色を自動で設定できるようにしたいと考えています。
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35468 / ResNo.1)  Re[1]: TabPageの背景色
□投稿者/ くるり 一般人(2回)-(2023/07/08(Sat) 22:47:17)
  • アイコン補足です。

    >TabPageの背景色である#F9F9F9を直接指定しようと思いますが

    この色は、TabPageのスクリーンショットを取って、ペイントで確認したものです。
違反を報告
引用返信
■35469 / ResNo.2)  Re[1]: TabPageの背景色
□投稿者/ KOZ 一般人(21回)-(2023/07/09(Sun) 19:46:06)
  • アイコン
    No35467に返信(くるりさんの記事)
    > 親コントロールと同色のReadonlyのTextboxを設置したいのですが、何か良い方法はあるでしょうか。
    
    DrawToBitmap で bmp に描画して、GetPixel で色を取得するとか。
    
    Public Class Form1
    
        Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
            Dim sz = TabPage1.Size
            Using bmp As New Bitmap(sz.Width, sz.Height)
                TabPage1.DrawToBitmap(bmp, New Rectangle(Point.Empty, sz))
                Dim bkColor = bmp.GetPixel(1, 1)
                TextBox1.BackColor = bkColor
            End Using
        End Sub
    
    End Class

違反を報告
引用返信
■35470 / ResNo.3)  Re[2]: TabPageの背景色
□投稿者/ くるり 一般人(3回)-(2023/07/10(Mon) 04:39:52)
  • アイコン>DrawToBitmap で bmp に描画して、GetPixel で色を取得するとか。

    サンプルコードをご提示いただき、ありがとうございます。
    こんな簡単に色情報を取得できるのですね。目からうろこです。

    ご提示いただいたコードを参考にすることで、目的としている機能の実装ができました。
    ありがとうございます。
解決み!
違反を報告
引用返信
■35471 / ResNo.4)  Re[3]: TabPageの背景色
□投稿者/ 魔界の仮面弁士 大御所(1556回)-(2023/07/10(Mon) 11:02:30)
  • アイコンNo35470に返信(くるりさんの記事)
    > こんな簡単に色情報を取得できるのですね。目からうろこです。

    ちなみに、TabPage の背景色は単色とは限りません。

    OS 側の設定テーマによっては、グラデーションがかかっているなど、
    座標ごとに複数の色が使用されていることがあります。
    http://dobon.net/vb/dotnet/graphics/drawvisualcontrol.html

    https://rarara.org/community/programming/%E3%82%BF%E3%83%96%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%83%8C%E6%99%AF%E8%89%B2%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F/
解決み!
違反を報告
引用返信
■35472 / ResNo.5)  Re[4]: TabPageの背景色
□投稿者/ くるり 一般人(4回)-(2023/07/10(Mon) 23:44:17)
  • アイコン2023/07/11(Tue) 12:09:39 編集(投稿者)
    2023/07/11(Tue) 12:06:40 編集(投稿者)

    > ちなみに、TabPage の背景色は単色とは限りません。
    > OS 側の設定テーマによっては、グラデーションがかかっているなど、
    > 座標ごとに複数の色が使用されていることがあります。

    情報ありがとうございます。

    なるほど。
    実は、どこかののプロパティなどから取得できないものか、
    もやもやしたものがありましたが、TabPageの背景色はグラデーションが
    設定されているなどOSのテーマに依存しており、プロパティから取得できる類の
    ものではなさそうですね。

    教えていただいたURLも参考になりそうです。ありがとうございます。

    サンプルはC++でしたが、VB.Netでグラデーションを想定した対応を実装するとすれば
    ・同じサイズのTabPage背景をメモリ上に描画(http://dobon.net/vb/dotnet/graphics/drawvisualcontrol.html)
    ・Textboxがある座標の画像を切り抜き、ブラシを作成
    ・ブラシを用いてTextboxを描画(OwnerDraw)
    といった流れですね。おそらく。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35466 / 親記事)  VB2022でクリスタルレポートが開けない
□投稿者/ zingbay 一般人(1回)-(2023/07/08(Sat) 22:02:52)
  • アイコン環境/言語:[Win10/Win11 .net4.8] 
    分類:[その他] 

    VB2012+バンドル版のクリスタルレポートで動かしているシステムがあり、それをマイグレーションしようとしています。
    マイグレ先はVB2022+同じくバンドル版のクリスタルレポートです。
    CRforVS6413SP33_0-80007712.EXEをSAPのサイトよりダウンロードし、インストールしました。
    
    Visual Studioでvb2021のプロジェクトを開き、含まれているレポート(.rptファイル)をクリックして開こうとしたところ、「クラスが登録されていません」が表示され、開く事ができません。
    
    対応方法が分からず、こちらへポストさせて頂きました。
    SAP公式の掲示板で同じような事象が無いかを調べたのですが、見つける事ができませんでした。
    
    何か、調べる手立てや対応方法をご教示頂けませんか?
    
    
    

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35473 / ResNo.1)  Re[1]: VB2022でクリスタルレポートが開けない
□投稿者/ とくま 一般人(1回)-(2023/07/11(Tue) 23:13:38)
  • アイコン2023/08/04(Fri) 20:19:32 編集(投稿者)

    No35466に返信(zingbayさんの記事)
    Crystal Reportsは、名前は同じですが、途中で開発元会社が変わっており、バージョンの違いで
    運用方法なども違いが出てきます。
    https://ja.wikipedia.org/wiki/Crystal_Reports
    そのうち、バンドル版と呼ばれるのは、Visusl Studioに同梱されてインストールされていた
    VS2008までのものを指すと思います。
    https://userapps.support.sap.com/sap/support/knowledge/ja/1514084
    >VB2012+バンドル版のクリスタルレポート
    →存在しません
    >VB2022+同じくバンドル版のクリスタルレポート
    →存在しません
    >SAPのサイトよりダウンロードし、
    →「SAP Crystal Reports」と呼びますが、機能的に呼ぶならプラグイン版です。バンドル版とは別物になります。

    ただ、ここで落とし穴は、Visusl Studioが下位互換で、ターゲットフレームワークを
    変えられることです。PCにインストールされているのはVS2015で、とあるプロジェクトは
    VS2008と同じビルドという場合があります。プロジェクトのプロパティ画面で「対象のフレームワーク」
    となっている部分に .NET Framework のバージョンの何が設定されているかになります。
    https://learn.microsoft.com/ja-jp/visualstudio/ide/visual-studio-multi-targeting-overview?view=vs-2022
    .NET FrameworkとVisusl Studioの対応表は以下。
    https://qiita.com/nskydiving/items/3af8bab5a0a63ccb9893

    ここまでで、マイグレーション元の
    >VB2012+バンドル版のクリスタルレポート
    で、正確な@ビルド時の.NET Framework のバージョンとACrystal Reportsのバージョンを調べてください。
    https://wiki.scn.sap.com/wiki/display/BOBJ/Which+Crystal+Reports+assembly+versions+are+supported+in+which+versions+of+Visual+Studio+.NET
    https://wiki.scn.sap.com/wiki/display/BOBJ/SAP+Crystal+Products+-+End+of+Mainstream+Maintenance+Dates

違反を報告
引用返信
■35482 / ResNo.2)  Re[1]: VB2022でクリスタルレポートが開けない
□投稿者/ とくま 一般人(2回)-(2023/08/04(Fri) 20:21:36)
  • アイコンNo35466に返信(zingbayさんの記事)
    反応ないので、内容は当たり前のことかもしれないけど、備忘録としてまとめ。

    バンドル版というのが本当であれば、プロジェクトはVB2012だけど、ソースコード及びレポートファイルはVB2008で
    実質、『VB2008+バンドル版クリレポ』→『VB2022+プラグイン版最新クリレポ』のマイグレーションとかなるわけです。

    私は、バンドル版→プラグイン版の時点で、配布の手間が多かったため、見送りました。まず、ランタイムが全く別で
    ある点。そしてマージモジュールを含むインストーラを用意しないと正常に稼働しないという情報があったから
    です。Win11で.NetFramework3.5以下が廃止に向けて分離されてる臭いですが、2,3年はまだ延命できるでしょう。
    そうすればシステム全体を見直す余地も出てきます。ユーザ数が多いと、こんな判断も必要かもしれません。

    さて、
    VBもクリレポも、基本的にはバージョン違いを同じ端末にインストール可能だと思われますが、こういう
    マイグレーション時は別のPCを用意したほうが良いです。
    >Visual Studioでvb2021のプロジェクトを開き、含まれているレポート(.rptファイル)をクリックして開こうとしたところ
    いきなりこんなことせず、まずは『VB2022+プラグイン版最新クリレポ』で新規レポートを作成して正常稼働できる
    確認が必要です。プラグイン版クリレポは、開発環境にランタイムをインストールすると不具合が起きるという
    情報もあり、開発PCとテストPCも別のほうが良いでしょう。
    https://trapemiya.hatenablog.com/entry/2020/02/19/021446

    『VB2022+プラグイン版最新クリレポ』が動かないなら、公式サポートを受けるのが早いと思います。
    で、正常稼働ができることを確認してから、レポートの自動アップグレードが可能かテストします。
    アップグレードが走らなければ、おそらくそのまま移行はできないと思われます。
    そうなると、旧開発環境でレポートを開き、設定を見ながら、新規レポートで再作成するしかないと
    思われます。
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35461 / 親記事)  C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(1回)-(2023/06/26(Mon) 10:58:52)
  • アイコン環境/言語:[Windows10 / C# / VisualStudio2015 / .Net Framework4.0] 
    分類:[.NET] 

    過去、Visual Studio 2015を使って、Tiffファイルを作成するアプリケーションを作成しました。

    最近になって「LEADTOOLSではJpeg圧縮のTiffファイルが作れるのに、あなたのソフトではできないのか?」といった問い合わせをもらいました。
    どうやらTiffでイメージ保存をしたいが、カラー画像だとサイズが大きいので画像はJpegにしたい(でもファイル形式はTiffのまま)ということのようです。

    私が作成した保存処理はTiffBitmapEncoderを使用しており、Compressionプロパティにセットできるものを調べるとJpegはありませんでした。

    有料のライブラリなどを使用せず、Jpeg圧縮のTiffファイルを保存する方法はないものでしょうか。
    (LEADTOOLSはライセンス料が高額なため使用したくない、という理由で.Netの機能を使用して画像保存を作成した経緯があります)

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35462 / ResNo.1)  Re[1]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ Hongliang 大御所(643回)-(2023/06/26(Mon) 12:48:38)
  • アイコンとりあえず、Windows 10 22H2では、 TiffBitmapEncoderを使っては無理みたいですね。
    // System.Windows.Media.Imaging.TiffCompressOptionには未定義の7というのも指定可能でしたが、これもLZWベースのようです。
    System.Drawingの方でも有効そうなものは見つからないので、少なくとも現時点では、恐らく.NET標準ライブラリでは扱えないでしょう。

    // System.Windows.Media.ImagingにせよSystem.DrawingにせよOSの機能をそのまま呼び出しているだけなので、そのうちWindowsのTIFFエンコーダがサポートするようになる可能性はゼロではないですが、期待薄と思います。

    どうしてもというなら、何らかのサードパーティ製ライブラリを使用するしかないでしょうね。
    NugetにはいくつかTIFFのライブラリがあるようです。ライセンスを確認の上で試されてみてはいかがでしょうか。
違反を報告
引用返信
■35463 / ResNo.2)  Re[2]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(2回)-(2023/06/26(Mon) 16:47:50)
  • アイコンNo35462に返信(Hongliangさんの記事)

    > どうしてもというなら、何らかのサードパーティ製ライブラリを使用するしかないでしょうね。
    > NugetにはいくつかTIFFのライブラリがあるようです。ライセンスを確認の上で試されてみてはいかがでしょうか。

    なるほど、やはり現在の.Netの標準ライブラリでは無理そうですね。
    商用利用もできて、安価もしくは無料で利用できるライブラリがないか探してみます。


違反を報告
引用返信
■35464 / ResNo.3)  Re[3]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ KOZ 一般人(20回)-(2023/06/27(Tue) 09:33:53)
  • アイコン
    2023/06/27(Tue) 09:36:20 編集(投稿者)
    
    ■No35463に返信(たろうさんの記事)
    
    Magick.NET でイケるようです。(ライセンスは Apache License 2.0)
    NuGet から Magick.NET.Core と Magick.NET-Q16-AnyCPU をインストールしてください。
    
    using ImageMagick;
    static class Program
    {
        [STAThread]
        static void Main() {
            using (MagickImage image = new MagickImage(@"z:\temp\test.png")) {
                image.Format = MagickFormat.Tiff;
                image.Settings.Compression = CompressionMethod.JPEG;
                image.Write(@"z:\temp\test.tif");
            }
        }
    }
    

違反を報告
引用返信
■35465 / ResNo.4)  Re[4]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(3回)-(2023/06/27(Tue) 15:47:44)
  • アイコンNo35464に返信(KOZさんの記事)
    > Magick.NET でイケるようです。(ライセンスは Apache License 2.0)


    情報ありがとうございます!
    試してみます。


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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35458 / 親記事)  エクセルのみ監視ができない
□投稿者/ たた 一般人(1回)-(2023/06/20(Tue) 20:07:08)
  • アイコン環境/言語:[VB.NET Freamwork4.8.1 VisualStudio2019] 
    分類:[.NET] 

    こちらのサイトのフォルダ、ファイルの変更を監視するを使って特定のエクセルを監視しようとしています。
    しかしながら、watcher.Filter の部分を
    watcher.Filter = "hoge.xlsx"
    としていますがhoge.xlsxが変更されても変更と認識されません。

    試しに watcher.Filter = "" としてみたところ
    changedResult の Name 部分が
    "FBF70100"
    のようになっており、"*.xlsx"の形になっていません。

    hoge.txt で試してみたところ正常にNameは hoge.txt になっていました。
    どのようにすれば hoge.xlsx を監視できるようになるでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35459 / ResNo.1)  Re[1]: エクセルのみ監視ができない
□投稿者/ Azulean 大御所(538回)-(2023/06/20(Tue) 21:38:03)
  • アイコンNo35458に返信(たたさんの記事)
    > こちらのサイトのフォルダ、ファイルの変更を監視するを使って特定のエクセルを監視しようとしています。

    Excel はおそらく、一時ファイルに書き込んで、正常に終了してから、名前の変更と削除で「上書きのように見せかけている」のが実情だと思います。

    新規作成・名前の変更・削除も拾えるようにして観察してみてください。
違反を報告
引用返信
■35460 / ResNo.2)  Re[2]: エクセルのみ監視ができない
□投稿者/ たた 一般人(2回)-(2023/06/21(Wed) 17:57:19)
  • アイコンいくつか疑問が残る結果になりましたが、とりあえず解決しました。

    備忘録もかねて
    最初に動作確認をした際には "hoge.xlsx" ですべて確保できていた。何故できていたのか不明だが、Azuleanさんの仰るように一時ファイルへの書き込みに対応しておく必要がある。
    "FBF70100" や "hoge.tmp" のように一時ファイルへの書き込み名が統一されていないため対応したプログラム作成を行わなければならない。
    場合によってはファイル名が "~$hoge.xlsx" となっている。
    これらをクリアしたプログラムを作成(スッキリとしませんが)すれば解決する。
解決み!
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■35451 / 親記事)  DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 炎の妖精さん 一般人(27回)-(2023/06/12(Mon) 13:30:32)
  • アイコン環境/言語:[Win10/VB.NET/Framework3.5/VS2010] 
    分類:[.NET] 

    お世話になり、いつも助けていただき感謝です。
    此度の件もお付き合いいただければ恐縮です。

    DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
    DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
    ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
    ●技術レポート「DataGridViewコントロールのVirtualMode(仮想モード)について」
    https://www.softech.co.jp/mm_200506_tr.htm

    今回はデータを表示させたいだけであり、新規行や削除、値の変更は全くありませんので"DataGridView.CellValueNeeded"のみの実装で良いかなと思いましたので
    実装したのですが、状況は変わらずメモリ不足のエラーが発生しました。

    どのように実装すればメモリ消費を抑えるコードが書けるのでしょうか?
    恐縮ですが、何卒よろしくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35453 / ResNo.1)  Re[1]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1553回)-(2023/06/12(Mon) 16:00:50)
  • アイコン
    No35451に返信(炎の妖精さんさんの記事)
    > DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
    仮に 1 レコード当たり 32 バイト程度のデータであったとしても、
    1000万レコードあったら、300MB 級のデータサイズになりますね。

    これらが Web Service として通信される場合、JSON や XML 化のために
    さらに数倍のデータ量が要求されることになるかもしれません。


    > ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
    どのように実装しましたか。
    実際に試せるような実験コードが提示されていないので、
    以下、概要のみの回答となりますが:


    > DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
    DataGridView の仮想モードであれ、ListView の仮想モードであれ、
    そもそも 1000万件のデータを画面に表示して、そのすべてをスクロールして
    その 1件 1件をすべて閲覧するという事は非常に稀であり、
    実際に必要なデータはごく一部だけであろうかと思います。

    なので仮想モードにおいては、「現在見えているページ」、「スクロールで要求されたページ」のための
    必要最小限の小さなデータを、必要に応じてサーバーから動的に読み込むという実装をとります。
    Google Map で地図をスクロールするたびに Web 通信が行われる状況に似ていますね。

    一度読み込んだデータでも、別の領域をロードしたらまた忘れられてしまうので、
    以前の情報をとっておきたい場合は、独自のキャッシュ処理を追加します。
    (いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
    https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8
違反を報告
引用返信
■35454 / ResNo.2)  Re[2]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1554回)-(2023/06/12(Mon) 16:11:32)
  • アイコンNo35453に追記(魔界の仮面弁士の記事)
    > (いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
    > https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8


    上記サンプルの場合、表示領域に合わせて、

    Select Top 【rowsPerPage】列1, 列2, 列3, …
    From テーブル名
    Where ソート条件列 NOT IN
    (
     Select Top 【lowerPageBoundary】 ソート条件列
     From テーブル名
     Order By ソート条件列
    )
    Order By ソート条件列

    という SQL Server への問い合わせが行われる想定ですね。
違反を報告
引用返信
■35455 / ResNo.3)  Re[3]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1555回)-(2023/06/12(Mon) 19:00:19)
  • アイコンNo35454に追記(魔界の仮面弁士の記事)
    > 上記サンプルの場合、表示領域に合わせて、
    > という SQL Server への問い合わせが行われる想定ですね。

    SQL Server 2012 以降や Oracle12c以降であれば、
    ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
    https://sql55.com/query/paging-query-results.php

    ページ指定での分割読取り手法は、お使いのデータベースによって
    使用可能な構文も異なるでしょうし、そこは随時調整してください。
違反を報告
引用返信
■35457 / ResNo.4)  Re[4]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 炎の妖精さん 一般人(28回)-(2023/06/13(Tue) 11:18:22)
  • アイコン魔界の仮面弁士様
    いつも助けていただきまして、ありがとうございます。

    > ■No35454に追記(魔界の仮面弁士の記事)
    >> 上記サンプルの場合、表示領域に合わせて、
    >> という SQL Server への問い合わせが行われる想定ですね。
    >
    > SQL Server 2012 以降や Oracle12c以降であれば、
    > ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
    > https://sql55.com/query/paging-query-results.php
    >
    > ページ指定での分割読取り手法は、お使いのデータベースによって
    > 使用可能な構文も異なるでしょうし、そこは随時調整してください。

    イメージとしましてはECサイトの検索画面のような感じでしょうか?
    1ページで20,30件を表示させ、ページ送りが出来るようなイメージです。

    その手法をとるなら、やりたいことが実現できるかも知れません。
    一度、検討させていただきます。

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

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






Mode/  Pass/


- Child Tree -