パネルの中に作ったパネルをスクロールさせるには
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2016/12/6 11:12:32
> デザイナーではスクロールバーが水平、垂直ともに表示されて良い感じなのですが、
> ビルドした時に消えてしまいます。
こちらでは再現しませんでした。
どういうデザイン設定にしているのかが分かるよう、
プロパティ情報などを列挙して頂けると、対応策を提示できるかも知れません。
> 今、タイムチャート表示ソフトを作りたいのです。
DataGridView を使うのはいかがでしょう。
> ビルドした時に消えてしまいます。
こちらでは再現しませんでした。
どういうデザイン設定にしているのかが分かるよう、
プロパティ情報などを列挙して頂けると、対応策を提示できるかも知れません。
> 今、タイムチャート表示ソフトを作りたいのです。
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(Boolean) Then
'ダブルクリックで On/Off 切り替え
cell.Value = Not CBool(cell.Value)
End If
End If
End Sub
End Class
ビルドした時に消えてしまいます。
なぜなのでしょうか?
パネルの中にパネルを作りたい理由:
今、タイムチャート表示ソフトを作りたいのです。
アドレス ビット変化
↓ ↓
X1 □■□■□■□□■■□□□□□□■■■■■■
X2 □■■■□■□■□□■□□■■□□□■■□□
X3 □□■□■□■□□■■□□□□■□□□□■■
X4 ■■■□□□□■□■□■□□■■□■■■■□
X5 □■□■□■■■■□□■■□□□□□□■■■
:
:
:
X28 □■□■□■□□□□□□□□□■■□□□■■
X29 ■■□■■■■□□■□□□□■■■□□■■□
X30 □□□■□□□□■□■□□□■■□□□□□□
アドレスは常に見えるように表示したい。
でなければどのビット変化なのかユーザーにわからないから。
水平スクロールするのはビット変化だけでよい。
アドレスは垂直スクロールしたい時がある。
その時はもちろんビット変化を同時に追従垂直スクロールする。
何かいい方法はないか?→Panelの中にPanelを作ればよいのではないか?
という経緯に至りました。