• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文: DataGridViewとHScrollBarのバーの幅を合わせる )

DataGridViewとHScrollBarのバーの幅を合わせる

このQ&Aのポイント
  • DataGridViewとHScrollBarのバーの幅を合わせる方法をお知りですか?
  • DataGridViewのセル幅の変更に伴い、HScrollBarのバーの大きさも連動させたいですが、どのプロパティにどの数字を入れればよいか分かりません。
  • HScrollBarとDataGridViewを連動するコードも同時に教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.5

>>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にて説明しています。 もし、解決しているのであれば これで解決済みとしてください。 ポイント付与を忘れずにお願いします。

MKT_
質問者

お礼

 NOBNNN様 度々のアドバイスどうもありがとうございましたm(_ _)m >これは基本的に無理です。 >データグリッドビュー(DGV1)の列単位での位置づけのメソッド >(DGV1.FirstDisplayedScrollingColumnIndex) しか用意されていません。 ↑これが分かったので更に助かりました.どうもありがとうございます. 列単位の移動でどうにか,見やすくなるように頑張ってみます. >もし、解決しているのであれば これで解決済みとしてください。  はい.前の「補足」にも書かせていただいておりますが, クローズさせていただければと思います. >ポイント付与を忘れずにお願いします。  はい.おひとり様20ptしか差し上げられないのが残念でございますが, もちろん付けさせていただきます^^ この度は誠にありがとうございました!!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.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です。 なぜこれより大きい値を設定しなければいけないのでしょうか?

MKT_
質問者

お礼

 どうもありがとうございます!!!!! なんとお礼を書かせていただいております間に再度 アドバイス&ご指摘いただけまして.. ( =私の理解が遅いという話しで,略 orz)  DGV1のいずれのセルにも長い文字列が入るので,左右の セルの比較がしづらくならないよう,ゆっくり横スクロール (DataGridViewのスクロールバードラッグ時のようにピクセル単位で 滑らかに)するコードを作製したかった次第でございます..  リンクをつけていただいたページも以前見させていただいた記憶が ございますが,あらためて読ませていただきますと >指定した列までスクロール と書いてくださっていますね^^; どうもありがとうございます. 入力値が過大になる原因と,双方のスクロールバーのドラッグボタンの 幅が一致しない原因はここでございますね^^  ということは,まず「DataGridViewの横スクロールをピクセル単位で 制御する方法」を掴んだ後に,タイトルの質問になってしまいますね...

MKT_
質問者

補足

(お礼後のコメントになります)  少しタイトルの内容からは想像がつきにくい問題を解決する 方向になりそうですので,NOBNNN様から > 質問します。 とコメントいただいた直後で少し端折る形になるかもしれませんが, 本質問に関してはここでクローズさせていただければと思います.  いただけた多大なコメント・アドバイスのおかげでコーディングの 方向が見えてまいりました.この度は誠にどうもありがとうございました!

すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.3

>>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のようにすれば問題は起こりません。 説明がわからないので 答えられません。 なんで引き算を行わないとだめなのか不自然です。

MKT_
質問者

お礼

 どうもありがとうございます!!! 本当に度々のご回答をどうもありがとうございます.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 もう少し頑張ってみます!!!

すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

>>HScrollBarでDataGridViewを連動させております。 >>DataGridView内のセル幅の変更に伴いバーの大きさが変更された際、 >>HScrollBarのバーの大きさもこれと同じにしたいのでございますが、 >>どのプロパティにどの数字を入れてやればよいのかが分からず、 >>1ヶ月ほど悩んでおりますorz 最初の質問を解釈すると DG1のヘッダーの部分のそれぞれの列幅が変更されると スクロールバーの横幅(サイズ)がDG1の全体の列幅と合わなくなるためスクロールバーの横幅をDG1の全体の列幅と同期させたい(同じ幅にする)という質問ではないのでしょうか? >>今色々と試させていただいておりますが, >>.Size = New Size(Wd, 10) >>といたしましたところ,HScrollBar全体のサイズが変わっております. >>(↑左右の三角マークも含んだ,スクロールバー自体のサイズでございます) >>VB2005とVB2008の仕様の違いでしょうか??  解決にはなっていないということでしょうか? >>HScrollBar全体のサイズが変わっております.  そのようになるようにしました ◆最初の質問の解釈では#1の回答になると思うのですが。  解釈の違い。つまり的がはずれているようでしたら失礼しました。  

MKT_
質問者

お礼

 どうもありがとうございます!! >的がはずれているようでしたら失礼しました いえいえいえとんでもございません。アドバイスいただければ十分でございます。 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  何かよい方法は無いものでございましょうか。。。 もし何かお考えつきましたら、是非ともアドバイスいただきたくお願い申し上げます。 どうぞよろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

質問する際には 環境を説明してください。 どのような開発ツールで 画面に配置するコントロールの配置および名称など・・・・ 質問者さまの質問は 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
MKT_
質問者

お礼

 どうもありがとうございます!!  開発環境はVista+VB2008になりますorz ↑いつもタイトルに書き入れておりましたが,OKWaveがリニューアルして タイトル入力項目が無くなっていたので書き忘れておりました. ご指摘どうもありがとうございますm(_ _)m  今色々と試させていただいておりますが, .Size = New Size(Wd, 10) といたしましたところ,HScrollBar全体のサイズが変わっております. (↑左右の三角マークも含んだ,スクロールバー自体のサイズでございます) VB2005とVB2008の仕様の違いでしょうか?? >「'データグリッド(Dg1)の左上隅にあるヘッダー セルの幅」が考慮されていませんので処理を追加しました。  ありがとうございます!!別のDGVでヘッダーを含むものがあるので, 参考にさせていただきます. この度はご閲覧・アドバイスいただきましてどうもありがとうございました. 

すると、全ての回答が全文表示されます。

関連するQ&A