解決済みの質問
DataGridViewとHScrollBarのバーの幅を合わせる
今晩は,質問させていただきます.どうぞよろしくお願いいたします.
HScrollBarでDataGridViewを連動させております。
DataGridView内のセル幅の変更に伴いバーの大きさが変更された際、
HScrollBarのバーの大きさもこれと同じにしたいのでございますが、
どのプロパティにどの数字を入れてやればよいのかが分からず、
1ヶ月ほど悩んでおりますorz
ためしに↓のようにコーディングいたしましたが、、、
Private Sub DGV1_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) _
Handles DGV1.ColumnWidthChanged
With HScrollBar1
.Minimum = 0
.Maximum = (DGV1.Columns(0).Width + DGV1.Columns(1).Width _
+ DGV1.Columns(2).Width + DGV1.Columns(3).Width _
+ DGV1.Columns(4).Width + DGV1.Columns(5).Width)
'↑例えばColumnが0~5まである場合でございます。
'おそらく「.Maximum」に何か入れるのでは、、と
'推測している次第でございますが。。。
End With
End Sub
↑この場合、HScrollBarの幅がDataGridViewより小さくなったり
してしまい、その状態のままHScrollBarを動かしてしまいますと、
DataGridViewを連動させることができずエラーになってしまいます。
以下、必要ないかもしれませんが、HScrollBarとDataGridViewを
連動させているコードでございます。
Private Sub HScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _
Handles HScrollBar1.Scroll
DGV1.FirstDisplayedScrollingColumnIndex = e.NewValue
'↑ここでHScrollBarから大きい値が入ってしまい,
' エラー「指定された引数は、有効な値の範囲にありません」になります。
End Sub
何かよい方法がございましたら,是非ともアドバイスいただきたくお願いいたします.
もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします.
投稿日時 - 2009-12-21 19:31:39
>>DGV1のスクロールバーと同じような動作をHScrollbarにも期待して
>>おりましたので,ということは上に書かせていただきました
これは基本的に無理です。
データグリッドビュー(DGV1)の列単位での位置づけのメソッド(DGV1.FirstDisplayedScrollingColumnIndex) しか用意されていません。
もし、ピクセル単位に移動したいなら データグリッドビュー(DGV1)の派生クラスをご自分で作成し、
スクロール時のイベントにて移動した幅を取得する。 のと設定する。二つのメソッドを自作しなければできません。
参考:
■DataGridViewスクロールバー表示状態の取得について
http://dobon.net/vb/bbs/log3-34/20882.html
次に
>>DGV1 プロパティ
>>SIZE(横幅,縦幅):630,500
>>列(Column0~6 計7個×90=630)
>>に対して,
>>HscrollBar1 プロパティ
>>最大値(Maxmaum):630
>>といたしましたところ,HscrollBar1のドラッグできる部分が
>>DGV1のそれに対して非常に小さくなってしまいました.
意味がわかりません。 前回のケース1、ケース2はあくまでサンプルです。
ご自分の実現したい方法で コードを実装する必要があります。
さきに述べていますがHscrollBar1 をDGV1のスクロールバーと同じような動作をHScrollbarにも期待するのは無理です。
DGV1の列が7個のときHScrollbarの最大値を(700)として 右に動かした時の値が 100分の1 つまり0.01 倍にて整数値を取得して DGV1.FirstDisplayedScrollingColumnIndexに 整数値、0~6 が入るような計算値を設定してください。
HScrollbarが見かけ上 どのような幅にしたら最適になるのかは この最大値と横幅で決定できると思います。
>>DGV1の横スクロールバーをゆっくり右にドラッグいたしますと
>>「1ピクセルずつ」動いておりますが,HScrollbar1を同様に動かしますと,
D>>GV1は「1セルずつ」動きます.
これは仕様です。 DGV1.FirstDisplayedScrollingColumnIndex について ご自分で理解してください。
先に 参考のHPにて説明しています。
もし、解決しているのであれば これで解決済みとしてください。
ポイント付与を忘れずにお願いします。
投稿日時 - 2009-12-22 22:35:01
お礼
NOBNNN様
度々のアドバイスどうもありがとうございましたm(_ _)m
>これは基本的に無理です。
>データグリッドビュー(DGV1)の列単位での位置づけのメソッド
>(DGV1.FirstDisplayedScrollingColumnIndex) しか用意されていません。
↑これが分かったので更に助かりました.どうもありがとうございます.
列単位の移動でどうにか,見やすくなるように頑張ってみます.
>もし、解決しているのであれば これで解決済みとしてください。
はい.前の「補足」にも書かせていただいておりますが,
クローズさせていただければと思います.
>ポイント付与を忘れずにお願いします。
はい.おひとり様20ptしか差し上げられないのが残念でございますが,
もちろん付けさせていただきます^^
この度は誠にありがとうございました!!
投稿日時 - 2009-12-22 23:20:36
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
一部不自然な部分がありますので 質問します。
>>以下、必要ないかもしれませんが、HScrollBarとDataGridViewを
>>連動させているコードでございます。
>> Private Sub HScrollBar1_Scroll(ByVal sender As Object, ByVal e As >>System.Windows.Forms.ScrollEventArgs) _
>> Handles HScrollBar1.Scroll
>> DGV1.FirstDisplayedScrollingColumnIndex = e.NewValue
'↑ここでHScrollBarから大きい値が入ってしまい,
' エラー「指定された引数は、有効な値の範囲にありません」になります。
>> End Sub
の部分ですが
DGV1.FirstDisplayedScrollingColumnIndex
は データグリッドの列の数を超えた値は設定できません。
以下の参考;をみればわかります。
参考:
■DataGridViewの指定した行、列までスクロールする
http://dobon.net/vb/dotnet/datagridview/scrolltorow.html
データグリッドの列数が5個の場合、列の数は1番目を ZEROとしますので 0~4
の数字になるはずです。
もし、Hscroollbar を動かしてデータグリッドビューの指定した列までスクロールしたいなら
Hscroollbar の最大値(Maxmum )は4です。
なぜこれより大きい値を設定しなければいけないのでしょうか?
投稿日時 - 2009-12-22 20:50:44
補足
(お礼後のコメントになります)
少しタイトルの内容からは想像がつきにくい問題を解決する
方向になりそうですので,NOBNNN様から
> 質問します。
とコメントいただいた直後で少し端折る形になるかもしれませんが,
本質問に関してはここでクローズさせていただければと思います.
いただけた多大なコメント・アドバイスのおかげでコーディングの
方向が見えてまいりました.この度は誠にどうもありがとうございました!
投稿日時 - 2009-12-22 23:09:32
お礼
どうもありがとうございます!!!!!
なんとお礼を書かせていただいております間に再度
アドバイス&ご指摘いただけまして..
( =私の理解が遅いという話しで,略 orz)
DGV1のいずれのセルにも長い文字列が入るので,左右の
セルの比較がしづらくならないよう,ゆっくり横スクロール
(DataGridViewのスクロールバードラッグ時のようにピクセル単位で
滑らかに)するコードを作製したかった次第でございます..
リンクをつけていただいたページも以前見させていただいた記憶が
ございますが,あらためて読ませていただきますと
>指定した列までスクロール
と書いてくださっていますね^^; どうもありがとうございます.
入力値が過大になる原因と,双方のスクロールバーのドラッグボタンの
幅が一致しない原因はここでございますね^^
ということは,まず「DataGridViewの横スクロールをピクセル単位で
制御する方法」を掴んだ後に,タイトルの質問になってしまいますね...
投稿日時 - 2009-12-22 22:35:29
>>DataGridViewの「横スクロールバー内のドラッグできるバーの幅」と
>>HScrollBarの「スクロールバー内のドラッグできるバーの幅」が合わなくなる、
説明がややこしいです
スクロールバー(HscrollBar)について
スクロールバーは何のためにどのような動きになるかが想像できません。
スクロールバーというのは上限値つまり最大値(Maxmaum)ですねこの値にたいして
右へスクロールさせるとその分、値が変化します。
ただそれだけの機能です。
たとえば最大値(Maxmaum:1000 として 右へ50% ずらしたら スクロールバー(HscrollBar)の
値は500が設定されます。
一方データグリッドビュー(DGV1)のするスクロールバーは 垂直と水平の2種類があります。
表示させるには プロパティのScrollBarsに 両方(Both)、水平(Horizontal)、垂直(vetical)
のいずれかを設定します。
スクロールバーは 全体の列幅の合計値がデータグリッドビュー(DGV1)のSizeの横幅より小さければ
表示されなくなります。
でもスクロールできる最大幅は制限がありません。全体の列幅によってスクロールできる幅が変わります。
====================================================================================================
少し整理しましょう。
DGV1 プロパティ
SIZE(横幅,縦幅):500,200
SCROLL: Horizontal
MAXMUMSIZE(横幅,縦幅):1000,200
列(Column1~5)の横幅 :100 × 5個(合計は500)
とした場合
当然 HscrollBar プロパティは
SIZE(横幅,縦幅):500,20 DGV1の列幅の合計と同じにする
MAXMUMSIZE(横幅,縦幅):1000,200
最大値(Maxmaum):500
です。
______________________________________________________________________________
■ケース1
DGV1の列(Column1~5)のいずれかの列幅を大きくした、たとえば
Column1 の幅を 200にしたとしたら DGV1 のスクロールバーの大きさは
600 です。
ですから HscrollBarの最大値(Maxmaum):600 にしなければなりません。
■ケース2
今度は DGV1の列(Column1~5)のいずれかの列幅を大きくした、たとえば
Column1 の幅を 50にしたとしたら DGV1 のスクロールバーの大きさは
450 です。
ですから HscrollBarの最大値(Maxmaum):450 にしなければなりません。
====================================================================================================
上記のケース1とケース2のようにすれば問題は起こりません。
説明がわからないので 答えられません。
なんで引き算を行わないとだめなのか不自然です。
投稿日時 - 2009-12-22 20:22:13
お礼
どうもありがとうございます!!!
本当に度々のご回答をどうもありがとうございます.m(_ _)m
>少し整理しましょう。
の部分が非常に分かりやすく勉強になります^^
今アドバイスいただいたことを一通りテストいたしておりますが,
DGV1 プロパティ
SIZE(横幅,縦幅):630,500
列(Column0~6 計7個×90=630)
に対して,
HscrollBar1 プロパティ
最大値(Maxmaum):630
といたしましたところ,HscrollBar1のドラッグできる部分が
DGV1のそれに対して非常に小さくなってしまいました..
あと気がついたのですが,Column7を大きくした状態で
DGV1の横スクロールバーをゆっくり右にドラッグいたしますと
「1ピクセルずつ」動いておりますが,HScrollbar1を同様に動かしますと,
DGV1は「1セルずつ」動きます.
DGV1のスクロールバーと同じような動作をHScrollbarにも期待して
おりましたので,ということは上に書かせていただきました
>Private Sub HScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _
> Handles HScrollBar1.Scroll
> DGV1.FirstDisplayedScrollingColumnIndex = e.NewValue
> '↑ここでHScrollBarから大きい値が入ってしまい,
> ' エラー「指定された引数は、有効な値の範囲にありません」になります。
> End Sub
のFirstDisplayedScrollingColumnIndexが間違っている,ということのようですね...
道筋が見えてきました.アドバイスいただけたおかげでございます.
誠にありがとうございますm(_ _)m
もう少し頑張ってみます!!!
投稿日時 - 2009-12-22 21:31:16
>>HScrollBarでDataGridViewを連動させております。
>>DataGridView内のセル幅の変更に伴いバーの大きさが変更された際、
>>HScrollBarのバーの大きさもこれと同じにしたいのでございますが、
>>どのプロパティにどの数字を入れてやればよいのかが分からず、
>>1ヶ月ほど悩んでおりますorz
最初の質問を解釈すると DG1のヘッダーの部分のそれぞれの列幅が変更されると スクロールバーの横幅(サイズ)がDG1の全体の列幅と合わなくなるためスクロールバーの横幅をDG1の全体の列幅と同期させたい(同じ幅にする)という質問ではないのでしょうか?
>>今色々と試させていただいておりますが,
>>.Size = New Size(Wd, 10)
>>といたしましたところ,HScrollBar全体のサイズが変わっております.
>>(↑左右の三角マークも含んだ,スクロールバー自体のサイズでございます)
>>VB2005とVB2008の仕様の違いでしょうか??
解決にはなっていないということでしょうか?
>>HScrollBar全体のサイズが変わっております.
そのようになるようにしました
◆最初の質問の解釈では#1の回答になると思うのですが。
解釈の違い。つまり的がはずれているようでしたら失礼しました。
投稿日時 - 2009-12-22 10:38:47
お礼
どうもありがとうございます!!
>的がはずれているようでしたら失礼しました
いえいえいえとんでもございません。アドバイスいただければ十分でございます。
Wd += DGV1.Columns(I).Width
と書いていただけたので、コードもかなり綺麗になりました^^
今後こうやって書かせていただきます。
>最初の質問を解釈すると DG1のヘッダーの部分のそれぞれの列幅が変更されると
>スクロールバーの横幅(サイズ)がDG1の全体の列幅と合わなくなるため
>スクロールバーの横幅をDG1の全体の列幅と同期させたい(同じ幅にする)
>という質問ではないのでしょうか?
DataGridViewの「横スクロールバー内のドラッグできるバーの幅」と
HScrollBarの「スクロールバー内のドラッグできるバーの幅」が合わなくなる、
でございます。
例えば、初期状態
DGV1の横スクロールバー全体の大きさ:100
HScrollBar1の 〃 :100
DGV1の横スクロールバー内のドラッグできるバーの幅:30
HScrollBar1の 〃 :30
であれば問題ないのでございますが、このお互いの「30」が一致しなくなります。orz
ここからDGV1の列幅が小さくされまして
DGV1の横スクロールバー内のドラッグできるバーの幅:30→90
となったといたしますと、
DGV1のドラッグバーをスライドさせられる量:100-90=10
HScrollBar1の 〃 :100-30=70
となりますので、HScrollBar1のバーをどんどん右へずらしていきますと、
DGV1のバーだけが先に右へ突き当たってしまい、エラーを起こしてしまいます。orz
何かよい方法は無いものでございましょうか。。。
もし何かお考えつきましたら、是非ともアドバイスいただきたくお願い申し上げます。
どうぞよろしくお願いいたします。
投稿日時 - 2009-12-22 18:29:23
質問する際には 環境を説明してください。
どのような開発ツールで 画面に配置するコントロールの配置および名称など・・・・
質問者さまの質問は VB.NET 2005 のソースとして回答します。
以下は 実験済みです。
=========================<サンプル>=============================================
Private Sub DGV1_RowHeadersWidthChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGV1.RowHeadersWidthChanged
'データグリッド(Dg1)の左上隅にあるヘッダー セルの幅が変更された場合の処理
Call HScroll_width_set()
End Sub
Private Sub HScroll_width_set()
With HScrollBar1
Dim Wd As Integer = DGV1.TopLeftHeaderCell.Size.Width 'データグリッド(Dg1)の左上隅にあるヘッダー セルの幅
For I As Integer = 0 To DGV1.Columns.Count - 1
Wd += DGV1.Columns(I).Width
Next
'.Minimum = 0
'.Maximum = Wd
.Size = New Size(Wd, 0)
'↑例えばColumnが005まである場合でございます。
'おそらく「.Maximum」に何か入れるのでは、、と
'推測している次第でございますが。。。
End With
End Sub
End Class
=============================================================================================================================================
ソースを見てのとおり .Maximum の設定箇所が間違っており 正しくは .Size としてあげるだけです。
それと 「'データグリッド(Dg1)の左上隅にあるヘッダー セルの幅」が考慮されていませんので処理を追加しました。
以上が回答となります。
参考:
■フォームにスクロールバーをつける
http://dobon.net/vb/dotnet/form/autoscroll.html
参考URL:http://dobon.net/vb/dotnet/form/autoscroll.html
投稿日時 - 2009-12-22 00:51:43
お礼
どうもありがとうございます!!
開発環境はVista+VB2008になりますorz
↑いつもタイトルに書き入れておりましたが,OKWaveがリニューアルして
タイトル入力項目が無くなっていたので書き忘れておりました.
ご指摘どうもありがとうございますm(_ _)m
今色々と試させていただいておりますが,
.Size = New Size(Wd, 10)
といたしましたところ,HScrollBar全体のサイズが変わっております.
(↑左右の三角マークも含んだ,スクロールバー自体のサイズでございます)
VB2005とVB2008の仕様の違いでしょうか??
>「'データグリッド(Dg1)の左上隅にあるヘッダー セルの幅」が考慮されていませんので処理を追加しました。
ありがとうございます!!別のDGVでヘッダーを含むものがあるので,
参考にさせていただきます.
この度はご閲覧・アドバイスいただきましてどうもありがとうございました.
投稿日時 - 2009-12-22 02:02:00
OKWaveのオススメ
おすすめリンク