C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DataGridViewのスクロールバーの表示がおかしい


(過去ログ 17 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■6156 / inTopicNo.1)  DataGridViewのスクロールバーの表示がおかしい
  
□投稿者/ うよ (1回)-(2007/08/02(Thu) 16:29:14)

分類:[VB.NET/VB2005] 

VB2005にてDataGridViewを使用しています。
垂直スクロールバーを表示させているのですが、スクロールバーがなんだか変です。
行は100以上あるのですが、スクロールバーを動かしても15件分くらいしか見られません。

また、PageUpやPageDown、矢印キーだと見られるのですが、途中で例外が発生します。
しかし、例外の詳細の見方もよく分からず困っています。何かご存じの方がおられましたらご教示ください。
よろしくお願いいたします。

例外は以下の通りです。
System.ArgumentOutOfRangeException はハンドルされませんでした。
Message="'252' の値は 'Value' に対して有効ではありません。'Value' は 'minimum' と 'maximum' の間でなければなりません。\r\nパラメータ名: Value"
Source="System.Windows.Forms"
ParamName="Value"
StackTrace:
場所 System.Windows.Forms.ScrollBar.set_Value(Int32 value)
場所 System.Windows.Forms.DataGridView.ScrollRows(Int32 rowCount, Int32 deltaY, ScrollEventType scrollEventType)
場所 System.Windows.Forms.DataGridView.ScrollRowsByCount(Int32 rows, ScrollEventType scrollEventType)
場所 System.Windows.Forms.DataGridView.ScrollRowIntoView(Int32 columnIndex, Int32 rowIndex, Boolean committed, Boolean forCurrentCellChange)
場所 System.Windows.Forms.DataGridView.ScrollIntoView(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
場所 System.Windows.Forms.DataGridView.ProcessNextKey(Keys keyData)
場所 System.Windows.Forms.DataGridView.ProcessDataGridViewKey(KeyEventArgs e)
場所 System.Windows.Forms.DataGridView.OnKeyDown(KeyEventArgs e)
場所 System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
場所 System.Windows.Forms.DataGridView.ProcessKeyEventArgs(Message& m)
場所 System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
場所 System.Windows.Forms.Control.WmKeyChar(Message& m)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.DataGridView.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.Run(ApplicationContext context)
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
場所 ここは開発プログラムの名前空間.My.MyApplication.Main(String[] Args) 場所 17d14f5c-a337-4978-8281-53493378c1071.vb:行 81
場所 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()

引用返信 編集キー/
■6162 / inTopicNo.2)  Re[1]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ R・田中一郎 (48回)-(2007/08/02(Thu) 19:51:34)
R・田中一郎 さんの Web サイト
スクロールバーの知っている件数が実際に表示されている件数と違う。
つまり間違っているということではないかな?

どのようにデータをDataGridViewにつっこんでいるのでしょうか?
引用返信 編集キー/
■6169 / inTopicNo.3)  Re[2]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ うよ (2回)-(2007/08/03(Fri) 09:23:06)
No6162 (R・田中一郎 さん) に返信
> スクロールバーの知っている件数が実際に表示されている件数と違う。
> つまり間違っているということではないかな?
> 
> どのようにデータをDataGridViewにつっこんでいるのでしょうか?

データバインドではなく、コードで直につっこんでいます。
以下列数など変えたソースです。何かわかりますでしょうか。
おかしなところなどありましたらご指摘下さい。


[データグリッドのの初期化用サブルーチン]
'列の設定
Dim _col00 As New DataGridViewTextBoxColumn
_col00.Name = "No"
_col00.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
_col00.DefaultCellStyle.BackColor = Color.WhiteSmoke
_col00.SortMode = DataGridViewColumnSortMode.NotSortable
_col00.Width = 25

Dim _col01 As New DataGridViewTextBoxColumn
_col01.Name = "列1"
_col01.HeaderText = "列1の内容"
_col01.SortMode = DataGridViewColumnSortMode.NotSortable
_col01.Width = 80

With データグリッド
    '列の追加
    .Columns.Add(_col00)
    .Columns.Add(_col01)
    '行の追加
    For i As Integer = 0 To 300
        .Rows.Add()
        .Rows(i).Cells("No").Value = (i + 1).ToString
    Next
    '表の設定
    .AllowUserToAddRows = False
    .AllowUserToDeleteRows = False
    .AllowUserToOrderColumns = False
    .AllowUserToResizeColumns = False
    .AllowUserToResizeRows = False
    .ReadOnly = True
    .RowHeadersVisible = False
    .RowTemplate.Height = 12
End With


[データの設定用サブルーチン]
For i As Integer = 0 To 読み込み対象データの数 - 1
    Try
        列1用変数 = データのうち、列1に設定したい値
    Catch ex As Exception
        列1用変数 = ""
    End Try
    データグリッド.Rows(i).Cells("列1").Value = 列1用変数
Next

引用返信 編集キー/
■6263 / inTopicNo.4)  Re[3]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ y4yama (12回)-(2007/08/07(Tue) 10:29:42)
No6169 (うよ さん) に返信
スクロールバーは、DataGridViewとは別のものを作ってますか?(それはないですよね?)

> データバインドではなく、コードで直につっこんでいます。
VB2005でやってみましたが、300件でなにも問題はないです。

> データグリッド.Rows(i).Cells("列1").Value = 列1用変数
は再現できないので、 .Value = i+1001 としましたが・・・
どうも、列1用変数?を疑ってしまいます・・・
引用返信 編集キー/
■6283 / inTopicNo.5)  Re[4]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ うよ (3回)-(2007/08/07(Tue) 15:19:11)
No6263 (y4yama さん) に返信
> スクロールバーは、DataGridViewとは別のものを作ってますか?(それはないですよね?)

はい、別ではないです。


>> データグリッド.Rows(i).Cells("列1").Value = 列1用変数
> は再現できないので、 .Value = i+1001 としましたが・・・
> どうも、列1用変数?を疑ってしまいます・・・

列1用変数は、String型です。""の場合もあります。
String型がダメだったりするのでしょうか?



自分でも色々やっているなかで、[データグリッドのの初期化用サブルーチン]
の最後([With データグリッド]内)に
.VirtualMode = True
.VirtualMode = False
を追加すると正しく表示されます。



引用返信 編集キー/
■6457 / inTopicNo.6)  Re[5]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ のぶ (1回)-(2007/08/14(Tue) 10:41:00)
うよさん

結局、解決策は見つけられたのでしょうか?
私はC#の環境なのですが、しばらく前に同様の現象が発生したことがあります。

・DataGridViewを使う
・スクロールバーはDataGridViewのもの
・中身はバインドではなく、コード内で手動で追加(約10000件)

の条件で、中身の追加を別スレッドで行っていると発生し、
中身の追加をメインのスレッドで行うようにすると発生しなくなりました。
その時に調べた範囲では、データそのものは正しく入っているものの、
表示用の列数が少なくなり、その領域にPageDown等でアクセスすると、
「範囲外」という例外が発生していました。

とりあえず、内部で使うツールだったので、別スレッドで読み込むことを
諦めて逃げていたのですが、試しに、うよさんの以下のコードを追加してみたところ、
表示されるようになりました。
> .VirtualMode = True
> .VirtualMode = False


引用返信 編集キー/
■6458 / inTopicNo.7)  Re[6]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ れい (37回)-(2007/08/14(Tue) 11:59:28)
No6457 (のぶ さん) に返信
> うよさん
> の条件で、中身の追加を別スレッドで行っていると発生し、

DataGridViewに限らず、
Controlのメソッドのほとんどは、作成元スレッドでしか正常に動作しません。

MSDN Control.InvokeRequired プロパティより。
>Windows フォーム内のコントロールは、特定のスレッドにバインドされているため、スレッド セーフではありません。
>したがって、異なるスレッドからコントロールのメソッドを呼び出す場合は、コントロールの invoke メソッドを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。


>とりあえず、内部で使うツールだったので、別スレッドで読み込むことを
>諦めて逃げていたのですが、試しに、うよさんの以下のコードを追加してみたところ、
>表示されるようになりました。
>> .VirtualMode = True
>> .VirtualMode = False

たまたまうまく動作しているだけでしょう。
何が起こるかわかりませんので、
もとの通り、コントロール作成元スレッドで追加するのが正解です。

引用返信 編集キー/
■6770 / inTopicNo.8)  Re[6]: DataGridViewのスクロールバーの表示がおかしい
□投稿者/ うよ (4回)-(2007/08/23(Thu) 15:27:49)
No6457 (のぶ さん) に返信
> 結局、解決策は見つけられたのでしょうか?
> 私はC#の環境なのですが、しばらく前に同様の現象が発生したことがあります。

根本的な解決策は見つけられぬままです。
前述のおまじないコードのみの対応でごまかしています。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -