|
2016/07/19(Tue) 14:34:35 編集(投稿者)
■No80444 (ym さん) に返信 > 分類:[ASP.NET (VB)]
Windows Forms アプリケーションの間違いですよね?
VB6 で Web アプリを作っていたとすると、選択肢としては
・ActiveX ドキュメント ・IIS アプリケーション(WebClass) ・DHTML アプリケーション ・ActiceX コントロール
ぐらいかと思いますが、このいずれかで DBGrid (DBGrid32.ocx : Data Bound Grid)を 使っていたというのは、ちょっと想像しにくいので…。
> 私はDbGridはVB6から使っているのですが、
確かに、DBGrid (DBGrid32.ocx) は VB6 に付属していましたが、 あくまでも VB4/VB5 からの移行を目的としたコントロールです。
標準ではインストールされておらず、CD-ROM から ocx ファイルを ローカルにコピーしたうえで、手動でのライセンス割り当ておよび レジストリ登録が必要な「互換部品」として提供されるものです。
そして、DBGrid を VB.NET から使うことはほぼ絶望的と言わざるを得ません。 VB6 向けの DataGrid (MSDatGrd.ocx) ならまだ救いはあったのですが。
AxDBGrid は、旧VB の デザイナーと深く結びついているがゆえ、 経験上、VB.NET 環境で期待動作させることが非常に難しいです。
デザイナーの対応が不十分というだけではなく、実行時にも 内部的に利用されているらしきワーカースレッドからの呼び出しエラーや、 それに伴う hWnd の生成失敗など、数々の障害を経験しています。
そもそも DBGrid は、たとえ VB6 であったとしても、OLE DB ベースの データバインドに対応していません。御存知のように、デザイン時の段階で 「Data コントロール」または「RDO コントロール」に接続しておかねば ならないという制限があります。
その上 VB.NET においては、Data コントロールも RDO コントロールも 実用にはなりません。 Microsoft.VisualBasic.Compatibility.VB6 名前空間の支援も無いですし。
特に「Data コントロール」は "標準コントロール" です。 そもそも ActiveX コントロールですら無いため、VB.NET 上から 呼び出すことができません。
「RDO コントロール」の方は、ライセンス上は Enterprise Edition が 必要です(再頒布しないなら VB6CONTROLS.REG の導入で利用可能)が、 こちらは "ActiveX コントロール" であることから、一応は アップグレード ウィザードなどを通じて、AxMSRDC として フォームに貼りつけて呼び出すことが出来ます。 ただし、デザイナーサポートは無いため、使うとすれば、実行時に Resultset プロパティを通じて、レコードを自分で制御するような 使い方が必要となります。
結局のところ、バインドできない以上は、DBGrid(AxDBGrid) では 「Unbound何某」系イベントを通じてのアンバウンドモードしか 利用できないということになります。
アンバウンドモードであれば、特定のデータソースには依存しないため、 OLEDB でも RDO でも DAO でも ADO.NET でも、任意のデータソースと 連携が可能です。ただ、VB6 で使った事があれば御存知とは思いますが、 アンバウンドの場合、各イベントに対応したコードを書く手間が必要なので、 とてもお手軽な方法とは言えません。
第一、アンバウンドモードであれば、System.Windows.Forms.DataGridView でも 使えるわけですから、無理に ActiveX コントロールを使い続ける理由は 無いと思います。 https://msdn.microsoft.com/ja-jp/library/5s3ce6k8%28vs.110%29.aspx
> かたやDataGridViewは気が遠くなる程時間がかかってしまいます。
当方の VB2008 では、十分な速度が出ているように見えましたが、 具体的にはどの程度かかるのでしょうか?
下記のコードで実験してみましたが、バインド時間は 一万件で 0.03 秒以内 十万件で 0.30 秒以内 百万件で 3.00 秒以内 という結果になりました。
# 各 5 回計測した最長時間を掲載しています。 # (キャッシュが効いた場合はもっと早いです)
※追記:上記では、件数オーダーを見誤って回答していました。 ※ 再測定結果を No80461 に掲載しましたので、そちらもご覧ください。
データ形式やフォーマット指定、実行環境の性能などに 左右されるので一概には言えませんが、一応参考までに。
Public Class Form1 Private WithEvents dgv As DataGridView Private WithEvents btn As Button Private WithEvents tbl As DataTable Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
dgv = New DataGridView() dgv.Dock = DockStyle.Fill Controls.Add(dgv)
btn = New Button() btn.Dock = DockStyle.Top btn.Text = "Bind" Controls.Add(btn)
'一万件のサンプルデータ tbl = CreateSample(10000) End Sub
Private Function CreateSample(ByVal rowCount As Integer) As DataTable Dim dt As New DataTable("TBL") dt.Columns.Add("COL1", GetType(Integer)) dt.Columns.Add("COL2", GetType(Integer)) dt.Columns.Add("COL3", GetType(Integer)) For r As Integer = 1 To rowCount dt.Rows.Add(r * 100 + 1, r * 100 + 2, r * 100 + 3) Next dt.PrimaryKey = New DataColumn() {dt.Columns("COL1")} Return dt End Function
Private Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn.Click dgv.DataSource = Nothing dgv.Columns.Clear() dgv.AutoGenerateColumns = True Dim sw As Stopwatch = Stopwatch.StartNew dgv.DataSource = tbl sw.Stop() MsgBox("完了:" & sw.Elapsed.ToString()) End Sub End Class
|