パネルの中に作ったパネルをスクロールさせるには

タグの編集
投稿者 BODE  (社会人) 投稿日時 2016/12/6 07:23:33
題名の通り、デザイナーではスクロールバーが水平、垂直ともに表示されて良い感じなのですが、
ビルドした時に消えてしまいます。
なぜなのでしょうか?

パネルの中にパネルを作りたい理由:

今、タイムチャート表示ソフトを作りたいのです。

アドレス ビット変化
↓     ↓
X1   □■□■□■□□■■□□□□□□■■■■■■ 
X2   □■■■□■□■□□■□□■■□□□■■□□ 
X3   □□■□■□■□□■■□□□□■□□□□■■
X4   ■■■□□□□■□■□■□□■■□■■■■□   
X5   □■□■□■■■■□□■■□□□□□□■■■
:    
:      
:     
X28 □■□■□■□□□□□□□□□■■□□□■■
X29 ■■□■■■■□□■□□□□■■■□□■■□
X30 □□□■□□□□■□■□□□■■□□□□□□

アドレスは常に見えるように表示したい。
でなければどのビット変化なのかユーザーにわからないから。
水平スクロールするのはビット変化だけでよい。

アドレスは垂直スクロールしたい時がある。
その時はもちろんビット変化を同時に追従垂直スクロールする。

何かいい方法はないか?→Panelの中にPanelを作ればよいのではないか?

という経緯に至りました。




投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/6 11:12:32
> デザイナーではスクロールバーが水平、垂直ともに表示されて良い感じなのですが、
> ビルドした時に消えてしまいます。

こちらでは再現しませんでした。

どういうデザイン設定にしているのかが分かるよう、
プロパティ情報などを列挙して頂けると、対応策を提示できるかも知れません。


> 今、タイムチャート表示ソフトを作りたいのです。
DataGridView を使うのはいかがでしょう。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/6 11:13:37
DataGridView 案

Imports System.Drawing.Drawing2D
Imports System.ComponentModel
Public Class Form1
 Private WithEvents dgv As DataGridView
 Private tbl As DataTable
 Private Const MaxColumn As Integer = 50

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  'DataGridView の生成コード 
  '通常はデザイン時に設定しておけば OK 
  InitializeComponent2()

  '表示させるためのデータを用意 
  tbl = CreateTable()
  dgv.DataSource = tbl

  'タイムチャートの編集は この DataTable に対して行う 
  FillSample(tbl, 30)
 End Sub

 Private Function CreateTable() As DataTable
  Dim ds As New DataSet()
  Dim tbl = ds.Tables.Add("BitTable")
  tbl.PrimaryKey = New DataColumn() {tbl.Columns.Add("Address"GetType(String))}
  For c = 1 To MaxColumn
   tbl.Columns.Add(CStr(c), GetType(Boolean)).AllowDBNull = False
  Next
  Return tbl
 End Function

 Private Sub FillSample(ByVal tbl As DataTable, recordCount As Integer)
  Dim rand As New Random()
  For adrNum = 1 To recordCount
   Dim newRow = tbl.NewRow()
   newRow("Address") = "X" & CStr(adrNum)
   For Each col In tbl.Columns.OfType(Of DataColumn).Skip(1)
    newRow(col) = CBool(rand.Next() And 2)
   Next
   tbl.Rows.Add(newRow)
  Next
  tbl.AcceptChanges()
 End Sub

 Private Sub InitializeComponent2()
  dgv = New DataGridView()
  Dim design As ISupportInitialize = dgv
  design.BeginInit()
  dgv.Dock = DockStyle.Fill
  dgv.ReadOnly = True
  dgv.RowHeadersVisible = False
  dgv.ColumnHeadersVisible = True
  dgv.ColumnHeadersHeightSizeMode = _
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing
  dgv.AllowUserToAddRows = False
  dgv.AllowUserToDeleteRows = False
  dgv.AllowUserToOrderColumns = False
  dgv.AllowUserToResizeRows = False
  dgv.ShowCellToolTips = False
  dgv.ScrollBars = ScrollBars.Both
  Dim col As DataGridViewTextBoxColumn
  col = New DataGridViewTextBoxColumn()
  col.Name = "colAddress"
  col.DataPropertyName = "Address"
  col.HeaderText = "アドレス"
  col.Frozen = True
  col.DividerWidth = 2
  col.SortMode = DataGridViewColumnSortMode.Programmatic
  col.Resizable = True
  col.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
  dgv.Columns.Add(col)
  For c As Integer = 1 To MaxColumn
   col = New DataGridViewTextBoxColumn()
   col.Name = "col" & CStr(c)
   col.DataPropertyName = CStr(c)
   col.HeaderText = CStr(c)
   col.Width = 24
   col.SortMode = DataGridViewColumnSortMode.Programmatic
   col.Resizable = DataGridViewTriState.False
   col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
   dgv.Columns.Add(col)
  Next
  Controls.Add(dgv)
  design.EndInit()
 End Sub

 Private Sub dgv_CellPainting(sender As Object, _
    e As DataGridViewCellPaintingEventArgs) Handles dgv.CellPainting
  If e.RowIndex < 0 OrElse e.ColumnIndex <= 0 Then
   Return
  End If
  If e.ColumnIndex Mod 5 <> 0 Then
   e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None
   e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None
  End If

  'タイムチャート セルの On/Off で色を変える 
  Dim brs As Brush
  If CBool(e.Value) Then
   brs = New LinearGradientBrush(e.CellBounds, Color.SpringGreen, _
     Color.LightSeaGreen, LinearGradientMode.ForwardDiagonal)
  Else
   brs = New SolidBrush(SystemColors.Window)
  End If
  e.Graphics.FillRectangle(brs, e.CellBounds)
  e.Paint(e.CellBounds, DataGridViewPaintParts.Border)
  brs.Dispose()

  If dgv.CurrentCellAddress = New Point(e.ColumnIndex, e.RowIndex) Then
   ControlPaint.DrawFocusRectangle(e.Graphics, e.CellBounds)
  End If

  e.Handled = True
 End Sub

 Private Sub dgv_CellDoubleClick(sender As Object, _
    e As DataGridViewCellEventArgs) Handles dgv.CellDoubleClick
  If e.RowIndex > 0 AndAlso e.ColumnIndex > 0 Then
   Dim cell As DataGridViewCell = dgv(e.ColumnIndex, e.RowIndex)
   If cell.ValueType Is GetType(BooleanThen
    'ダブルクリックで On/Off 切り替え 
    cell.Value = Not CBool(cell.Value)
   End If
  End If
 End Sub
End Class