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

わんくま同盟

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

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

ツリー一括表示

DataGridViewのスクロールバーの設定 /かんぼ (24/05/28(Tue) 14:44) #103142
Re[1]: DataGridViewのスクロールバーの設定 /とくま (24/05/28(Tue) 16:35) #103145
Re[1]: DataGridViewのスクロールバーの設定 /KOZ (24/05/28(Tue) 16:35) #103144
  └ Re[2]: DataGridViewのスクロールバーの設定 /かんぼ (24/05/28(Tue) 17:02) #103146
    └ Re[3]: DataGridViewのスクロールバーの設定 /KOZ (24/05/28(Tue) 18:56) #103147
      └ Re[4]: DataGridViewのスクロールバーの設定 /かんぼ (24/05/30(Thu) 22:11) #103154
        └ Re[5]: DataGridViewのスクロールバーの設定 /KOZ (24/05/31(Fri) 04:00) #103155
          └ Re[6]: DataGridViewのスクロールバーの設定 /KOZ (24/05/31(Fri) 04:43) #103156
            └ Re[7]: DataGridViewのスクロールバーの設定 /かんぼ (24/05/31(Fri) 13:47) #103158
              └ Re[8]: DataGridViewのスクロールバーの設定 /KOZ (24/05/31(Fri) 15:14) #103159
                └ Re[9]: DataGridViewのスクロールバーの設定 /かんぽ (24/06/01(Sat) 09:48) #103163
                  └ Re[10]: DataGridViewのスクロールバーの設定 /KOZ (24/06/01(Sat) 15:38) #103164
                    └ Re[11]: DataGridViewのスクロールバーの設定 /かんぽ (24/06/01(Sat) 17:44) #103165
                      └ Re[12]: DataGridViewのスクロールバーの設定 /KOZ (24/06/01(Sat) 22:14) #103166
                        └ Re[13]: DataGridViewのスクロールバーの設定 /かんぽ (24/06/02(Sun) 10:52) #103167
                          └ Re[14]: DataGridViewのスクロールバーの設定 /KOZ (24/06/02(Sun) 11:43) #103168
                            └ Re[15]: DataGridViewのスクロールバーの設定 /KOZ (24/06/02(Sun) 19:51) #103169
                              └ Re[16]: DataGridViewのスクロールバーの設定 /かんぽ (24/06/16(Sun) 16:03) #103182
                                └ Re[17]: DataGridViewのスクロールバーの設定 /KOZ (24/06/16(Sun) 17:02) #103183
                                  └ Re[18]: DataGridViewのスクロールバーの設定 /かんぽ (24/06/16(Sun) 21:33) #103184
                                    ├ Re[19]: DataGridViewのスクロールバーの設定 /KOZ (24/06/17(Mon) 02:14) #103185
                                    └ Re[19]: DataGridViewのスクロールバーの設定 /とくま (24/06/17(Mon) 10:23) #103186


親記事 / ▼[ 103145 ] ▼[ 103144 ]
■103142 / 親階層)  DataGridViewのスクロールバーの設定
□投稿者/ かんぼ (1回)-(2024/05/28(Tue) 14:44:40)

分類:[.NET 全般] 

VB.NETでDataGridViewを使ったアプリを開発しております。


あるセルに10行分の文字列が格納されているとします。
しかし、DataGridViewのサイズが小さく、6行分の高さしかないとします。

すると、10行分の文字列が格納されたセルを表示させた時、
最初の6行分しか表示されません。
シークバーを動かすると、次のセルが一番上に来るため、
10行分の文字列のうち、最後の4行分のデータは表示できないことになります。

どうにか、スクロールバーを連続的に動かせるなどして
全データを表示させることはできないでしょうか?


スクロールバーの設定を確認してみましたが、
該当する設定は見当たりませんでした。
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridview.scrollbars?view=windowsdesktop-8.0

どなたかご存じでしたら教えてください。



[ □ Tree ] 返信 編集キー/

▲[ 103142 ] / 返信無し
■103145 / 1階層)  Re[1]: DataGridViewのスクロールバーの設定
□投稿者/ とくま (7回)-(2024/05/28(Tue) 16:35:37)
No103142 (かんぼ さん) に返信
DataGridViewで10行使って表示して、CellFormatting や CellPainting を使って見た目を
1つの結合セルのように見せれば、10段階のスクロールで表示できるんじゃないでしょうか。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103142 ] / ▼[ 103146 ]
■103144 / 1階層)  Re[1]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (446回)-(2024/05/28(Tue) 16:35:29)
No103142 (かんぼ さん) に返信
> どうにか、スクロールバーを連続的に動かせるなどして
> 全データを表示させることはできないでしょうか?

FirstDisplayedCell を動かせばいいかと。

DataGridView1.FirstDisplayedCell = dataGridView1[0, 0]
DataGridView1.Refresh()
Task.Delay(200).Wait()
DataGridView1.FirstDisplayedCell = dataGridView1[0, 1]
DataGridView1.Refresh()
Task.Delay(200).Wait()

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103144 ] / ▼[ 103147 ]
■103146 / 2階層)  Re[2]: DataGridViewのスクロールバーの設定
□投稿者/ かんぼ (2回)-(2024/05/28(Tue) 17:02:14)
No103144 (KOZ さん) に返信
FirstDisplayedCell だとセルごとにしか
表示領域を設定できないので
同じセルの中で表示できていない領域を表示することはできないのではないでしょうか?


CellFormatting や CellPaintingは試していませんが、
コードが複雑になりそうな気がします。

検索すると、それらしいページは見つかるのですが、
https://stackoverflow.com/questions/51894308/issue-with-datagridview-vertical-scrolling

grid.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
これを設定しても変化しませんでした。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103146 ] / ▼[ 103154 ]
■103147 / 3階層)  Re[3]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (447回)-(2024/05/28(Tue) 18:56:40)
2024/05/28(Tue) 18:57:24 編集(投稿者)
No103146 (かんぼ さん) に返信
> FirstDisplayedCell だとセルごとにしか
> 表示領域を設定できないので
> 同じセルの中で表示できていない領域を表示することはできないのではないでしょうか?

完全に読み違えてました。

編集状態にすればスクロールバーが出せますが、どのようにしたいんでしょうか?

Private Sub DataGridView1_EditingControlShowing(
        sender As Object, e As DataGridViewEditingControlShowingEventArgs) _
        Handles DataGridView1.EditingControlShowing
    Dim textBox = TryCast(DataGridView1.EditingControl, TextBox)
    If textBox IsNot Nothing Then
        If textBox.Multiline Then
            textBox.ScrollBars = ScrollBars.Vertical
        Else
            textBox.ScrollBars = ScrollBars.None
        End If
    End If
End Sub

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103147 ] / ▼[ 103155 ]
■103154 / 4階層)  Re[4]: DataGridViewのスクロールバーの設定
□投稿者/ かんぼ (3回)-(2024/05/30(Thu) 22:11:37)

一つ目のセルに

A1
A2
A3
A4
A5
A6
A7

という内容が入っており、
二つ目のセルに

B1
B2
B3
B4
B5
B6
B7

という内容が入っているとします。


そして、DataGridViewの高さが5文字分しかないとします。
すると、当然ですが、

A1
A2
A3
A4
A5

までしか、文字列を表示することができません。

この状態で、スクロールバーを一つ動かすと、

B1
B2
B3
B4
B5

が表示されるため、

A6
A7

を表示することができません。

そのため、スクロールバーを一つ動かすと、

A2
A3
A4
A5
A6

二つ動かすと、

A3
A4
A5
A6
A7

三つ動かすと

A4
A5
A6
A7
B1

と表示されてほしいと考えています。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103154 ] / ▼[ 103156 ]
■103155 / 5階層)  Re[5]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (450回)-(2024/05/31(Fri) 04:00:47)
2024/05/31(Fri) 04:20:51 編集(投稿者)
No103154 (かんぼ さん) に返信

なるほど、こういう状態ですね。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    With DataGridView1
        Const fiveLinesValue = "1" & vbCrLf & "2" & vbCrLf & "3" & vbCrLf & "4" & vbCrLf & "5"
        Dim fiveLinesHeight As Integer
        Using g = .CreateGraphics()
            fiveLinesHeight = TextRenderer.MeasureText(g, fiveLinesValue, .Font).Height + 5
        End Using
        Dim cs = DataGridView1.ClientSize
        .ClientSize = New Size(cs.Width, fiveLinesHeight + .ColumnHeadersHeight)
        .Columns.Add(New DataGridViewTextBoxColumn With {.HeaderText = "Column1"})

        Dim columnValue = "A1" & vbCrLf & "A2" & vbCrLf & "A3" & vbCrLf & "A4" &
                         vbCrLf & "A5" & vbCrLf & "A6" & vbCrLf & "A7"
        .Rows.Add(columnValue)
        .Rows.Add(columnValue.Replace("A", "B"))
        .DefaultCellStyle.WrapMode = DataGridViewTriState.True
        .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
    End With
End Sub

行の高さがクライアント領域をはみ出すから問題なので、はみ出さないよう調整すればよいと思います。

Private Sub AdjustRowHeight(dgv As DataGridView)
    With dgv
        .DefaultCellStyle.WrapMode = DataGridViewTriState.True
        .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        Dim maxRowHeight = .ClientSize.Height - .ColumnHeadersHeight - 1
        Dim rowHeights = .Rows.Cast(Of DataGridViewRow).Select(Function(r) r.Height).ToArray()
        .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
        For i = 0 To rowHeights.Length - 1
            If rowHeights(i) > maxRowHeight Then
                .Rows(i).Height = maxRowHeight
            Else
                .Rows(i).Height = rowHeights(i)
            End If
        Next
    End With
End Sub

そうすれば、編集状態にしたときのスクロールバーが生きます。
中身を編集したくないのであれば、ReadOnly にします。

Private Sub DataGridView1_EditingControlShowing(
    sender As Object, e As DataGridViewEditingControlShowingEventArgs) _
    Handles DataGridView1.EditingControlShowing

    Dim editingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
    If editingControl IsNot Nothing Then
        editingControl.ReadOnly = True
        If editingControl.Multiline Then
            editingControl.ScrollBars = ScrollBars.Vertical
        Else
            editingControl.ScrollBars = ScrollBars.None
        End If
    End If
End Sub

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103155 ] / ▼[ 103158 ]
■103156 / 6階層)  Re[6]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (451回)-(2024/05/31(Fri) 04:43:16)
マウスホイールで行がスクロールするのが嫌であれば 
DataGridView を継承してカスタムコントロールを作って

Public Class DataGridViewEx
    Inherits DataGridView

    Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
        If Not IsCurrentCellInEditMode Then
            MyBase.OnMouseWheel(e)
        End If
    End Sub

End Class

としてください。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103156 ] / ▼[ 103159 ]
■103158 / 7階層)  Re[7]: DataGridViewのスクロールバーの設定
□投稿者/ かんぼ (4回)-(2024/05/31(Fri) 13:47:42)
No103156 (KOZ さん) に返信

ありがとうございます。

ただ、この方法って行の高さが自動で変わってしまわないでしょうか?

例えば、
A1

A100
くらいある場合に、
5行しか表示されないように行高さが自動で調節されたら
文字列が読めないくらいに小さくなってしまうと思います。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103158 ] / ▼[ 103163 ]
■103159 / 8階層)  Re[8]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (452回)-(2024/05/31(Fri) 15:14:37)
2024/05/31(Fri) 15:40:03 編集(投稿者)

No103158 (かんぼ さん) に返信
> ただ、この方法って行の高さが自動で変わってしまわないでしょうか?
>
> 例えば、
> A1
> 〜
> A100
> くらいある場合に、
> 5行しか表示されないように行高さが自動で調節されたら
> 文字列が読めないくらいに小さくなってしまうと思います。

DataGridView に文字を自動的に小さくするような機能はなかったと思います。
(あるのだったら教えてください)
もしそのような機能があるならカスタマイズされたコントロールです。
その機能を抑止することを試みてください、

とりあえずやってみてください。話はそれから伺いましょう。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103159 ] / ▼[ 103164 ]
■103163 / 9階層)  Re[9]: DataGridViewのスクロールバーの設定
□投稿者/ かんぽ (1回)-(2024/06/01(Sat) 09:48:11)
ありがとうございます。

試してみたのですが、
私の環境だと、スクロールバーを連続的に動かすことはできませんでした。

どうも
AdjustRowHeight

がどこから呼ばれていないように思いますが
これはどこかで使用しないといけないのではないでしょうか?

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103163 ] / ▼[ 103165 ]
■103164 / 10階層)  Re[10]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (453回)-(2024/06/01(Sat) 15:38:33)
No103163 (かんぽ さん) に返信
> どうも
> AdjustRowHeight
>
> がどこから呼ばれていないように思いますが
> これはどこかで使用しないといけないのではないでしょうか?

行を追加した後に実行してください。
[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103164 ] / ▼[ 103166 ]
■103165 / 11階層)  Re[11]: DataGridViewのスクロールバーの設定
□投稿者/ かんぽ (2回)-(2024/06/01(Sat) 17:44:55)
ありがとうございます。

しかし、この方法を使うと、
datagridviewが四行しか表示できない高さにある場合
のように全てのセルを表示しようとするため、
A1
A2
B1
B2
のようになってしまい、
セルのA3〜A7が表示されなくなってしまいます。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103165 ] / ▼[ 103167 ]
■103166 / 12階層)  Re[12]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (455回)-(2024/06/01(Sat) 22:14:31)
No103165 (かんぽ さん) に返信
> datagridviewが四行しか表示できない高さにある場合
> のように全てのセルを表示しようとするため、
> A1
> A2
> B1
> B2
> のようになってしまい、
> セルのA3〜A7が表示されなくなってしまいます。

AdjustRowHeight を実行していないですよね?これ
実行していたら
A1
A2
A3
A4
のようになるはずです。

まぁ実行していない状態でもセルを編集状態にするとスクロールバーが出てくるはずなんですけど。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103166 ] / ▼[ 103168 ]
■103167 / 13階層)  Re[13]: DataGridViewのスクロールバーの設定
□投稿者/ かんぽ (3回)-(2024/06/02(Sun) 10:52:24)
ありがとうございます。

以下のように、
Form1_LoadとForm1_SizeChanged
でAdjustRowHeightを実行しているのですが、

A1
A2
B1
B2
のような表示になります。

他にも入れる必要がある場所がありますか?


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

With DataGridView1
Const fiveLinesValue = "1" & vbCrLf & "2" & vbCrLf & "3" & vbCrLf & "4" & vbCrLf & "5"
Dim fiveLinesHeight As Integer
Using g = .CreateGraphics()
fiveLinesHeight = TextRenderer.MeasureText(g, fiveLinesValue, .Font).Height + 5
End Using
Dim cs = DataGridView1.ClientSize
.ClientSize = New Size(cs.Width, fiveLinesHeight + .ColumnHeadersHeight)
.Columns.Add(New DataGridViewTextBoxColumn With {.HeaderText = "Column1"})

Dim columnValue = "A1" & vbCrLf & "A2" & vbCrLf & "A3" & vbCrLf & "A4" &
vbCrLf & "A5" & vbCrLf & "A6" & vbCrLf & "A7"
.Rows.Add(columnValue)
.Rows.Add(columnValue.Replace("A", "B"))
.DefaultCellStyle.WrapMode = DataGridViewTriState.True
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
End With


Call AdjustRowHeight(DataGridView1)

End Sub


Private Sub AdjustRowHeight(dgv As DataGridView)
With dgv
.DefaultCellStyle.WrapMode = DataGridViewTriState.True
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
Dim maxRowHeight = .ClientSize.Height - .ColumnHeadersHeight - 1
Dim rowHeights = .Rows.Cast(Of DataGridViewRow).Select(Function(r) r.Height).ToArray()
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
For i = 0 To rowHeights.Length - 1
If rowHeights(i) > maxRowHeight Then
.Rows(i).Height = maxRowHeight
Else
.Rows(i).Height = rowHeights(i)
End If
Next
End With
End Sub


Private Sub DataGridView1_EditingControlShowing(
sender As Object, e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing

Dim editingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
If editingControl IsNot Nothing Then
editingControl.ReadOnly = True
If editingControl.Multiline Then
editingControl.ScrollBars = ScrollBars.Vertical
Else
editingControl.ScrollBars = ScrollBars.None
End If
End If
End Sub




Public Sub Form1_SizeChanged() Handles MyBase.SizeChanged

Call AdjustRowHeight(DataGridView1)

End Sub



[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103167 ] / ▼[ 103169 ]
■103168 / 14階層)  Re[14]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (456回)-(2024/06/02(Sun) 11:43:33)
No103167 (かんぽ さん) に返信

新規プロジェクトで Form1 に DataGriview をひとつ張り付けて実行していますが
かんぽさんの言われるような現象にはならないです。
[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103168 ] / ▼[ 103182 ]
■103169 / 15階層)  Re[15]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (457回)-(2024/06/02(Sun) 19:51:56)
水平スクロールバーのことを忘れていました。

Dim maxRowHeight = .ClientSize.Height - .ColumnHeadersHeight - 1

としていましたが、

Dim maxRowHeight = .DisplayRectangle.Height - .ColumnHeadersHeight - 1

が正しいです。

ただ、水平スクロールバーが表示されたというイベントがありません。
マウスホイールのこともあるし、カスタムコントロール側で行ったほうがよさそうです。

Public Class DataGridViewEx
    Inherits DataGridView

    Public Sub New()
        AddHandler HorizontalScrollBar.VisibleChanged, AddressOf HorizontalScrollBar_VisibleCganged
    End Sub

    Protected ReadOnly Property MaxRowHeight As Integer
        Get
            Return DisplayRectangle.Height - ColumnHeadersHeight - 1
        End Get
    End Property

    Private Sub HorizontalScrollBar_VisibleCganged(sender As Object, e As EventArgs)
        AdjustRows()
    End Sub

    Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
        If Not IsCurrentCellInEditMode Then
            MyBase.OnMouseWheel(e)
        End If
    End Sub

    Public Sub AdjustRows()
        AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        Dim rowHeights = Rows.Cast(Of DataGridViewRow).Select(Function(r) r.Height).ToArray()
        AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
        For i = 0 To rowHeights.Length - 1
            If rowHeights(i) > MaxRowHeight Then
                Rows(i).Height = MaxRowHeight
            Else
                Rows(i).Height = rowHeights(i)
            End If
        Next
    End Sub

    Public Sub AdjustRow(index As Integer)
        Dim row = Rows(index)
        AutoResizeRow(index, DataGridViewAutoSizeRowMode.AllCells)
        If row.Height > MaxRowHeight Then
            row.Height = MaxRowHeight
        End If
    End Sub

    Protected Overrides Sub OnResize(e As EventArgs)
        MyBase.OnResize(e)
        AdjustRows()
    End Sub

    Private IsReadOnlyColumnState As Boolean
    Private IsReadOnlyRowState As Boolean
    Private IsReadOnlyCellState As Boolean
    Private IsReadOnlyCell As Boolean

    Private Sub SaveReadOnly(cell As DataGridViewCell)
        IsReadOnlyColumnState = Columns(cell.ColumnIndex).State.HasFlag(DataGridViewElementStates.ReadOnly)
        IsReadOnlyRowState = Rows(cell.RowIndex).State.HasFlag(DataGridViewElementStates.ReadOnly)
        IsReadOnlyCellState = cell.State.HasFlag(DataGridViewElementStates.ReadOnly)
        IsReadOnlyCell = cell.ReadOnly

        Me.ReadOnly = False
        Columns(cell.ColumnIndex).ReadOnly = False
        Rows(cell.RowIndex).ReadOnly = False
        cell.ReadOnly = False
    End Sub

    Private Sub RestoreReadOnly(cell As DataGridViewCell)
        Columns(cell.ColumnIndex).ReadOnly = IsReadOnlyColumnState
        Rows(cell.RowIndex).ReadOnly = IsReadOnlyRowState
        cell.ReadOnly = IsReadOnlyCell
    End Sub

    Protected Overrides Sub OnCellEnter(e As DataGridViewCellEventArgs)
        Dim cell = Me(e.ColumnIndex, e.RowIndex)
        If TypeOf cell Is DataGridViewTextBoxCell Then
            SaveReadOnly(Me(e.ColumnIndex, e.RowIndex))
        End If
        MyBase.OnCellEnter(e)
    End Sub

    Protected Overrides Sub OnCellLeave(e As DataGridViewCellEventArgs)
        Dim cell = Me(e.ColumnIndex, e.RowIndex)
        If TypeOf cell Is DataGridViewTextBoxCell Then
            RestoreReadOnly(Me(e.ColumnIndex, e.RowIndex))
        End If
        MyBase.OnCellLeave(e)
    End Sub

    Protected Overrides Sub OnEditingControlShowing(e As DataGridViewEditingControlShowingEventArgs)
        MyBase.OnEditingControlShowing(e)
        Dim textBox = TryCast(e.Control, DataGridViewTextBoxEditingControl)
        If textBox IsNot Nothing Then
            textBox.ReadOnly = IsReadOnlyCell
            If textBox.Multiline Then
                textBox.ScrollBars = ScrollBars.Vertical
            Else
                textBox.ScrollBars = ScrollBars.None
            End If
        End If
    End Sub

    Protected Overrides Sub OnCellValueChanged(e As DataGridViewCellEventArgs)
        MyBase.OnCellValueChanged(e)
        AdjustRow(e.RowIndex)
    End Sub

End Class

考慮漏れなどあるかもしれませんが、カスタムコントロール側に手をいれるか、
AdjustRows/AdjustRow メソッドを本体側で呼び出してください。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103169 ] / ▼[ 103183 ]
■103182 / 16階層)  Re[16]: DataGridViewのスクロールバーの設定
□投稿者/ かんぽ (4回)-(2024/06/16(Sun) 16:03:32)
ありがとうございます。

Visual Studio2022 
.NET Framework4.7.2

の環境で

DataGridViewExを宣言した上で、
フォーム上にDataGridViewExを一つだけ配置し、
以下を実行していますが、
想定通りの挙動にはなりません。

どこを修正すればよろしいでしょうか?


Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        With DataGridViewEx1
            Const fiveLinesValue = "1" & vbCrLf & "2" & vbCrLf & "3" & vbCrLf & "4" & vbCrLf & "5"
            Dim fiveLinesHeight As Integer
            Using g = .CreateGraphics()
                fiveLinesHeight = TextRenderer.MeasureText(g, fiveLinesValue, .Font).Height + 5
            End Using
            Dim cs = DataGridViewEx1.ClientSize
            .ClientSize = New Size(cs.Width, fiveLinesHeight + .ColumnHeadersHeight)
            .Columns.Add(New DataGridViewTextBoxColumn With {.HeaderText = "Column1"})

            Dim columnValue = "A1" & vbCrLf & "A2" & vbCrLf & "A3" & vbCrLf & "A4" &
                             vbCrLf & "A5" & vbCrLf & "A6" & vbCrLf & "A7"
            .Rows.Add(columnValue)
            .Rows.Add(columnValue.Replace("A", "B"))
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells


            Call AdjustRowHeight(DataGridViewEx1)

            '  Call DataGridViewEx1.AdjustRow()
            Call DataGridViewEx1.AdjustRows()


        End With


    End Sub

    Private Sub AdjustRowHeight(dgv As DataGridViewEx)
        With dgv
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
            Dim maxRowHeight = .ClientSize.Height - .ColumnHeadersHeight - 1
            Dim rowHeights = .Rows.Cast(Of DataGridViewRow).Select(Function(r) r.Height).ToArray()
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
            For i = 0 To rowHeights.Length - 1
                If rowHeights(i) > maxRowHeight Then
                    .Rows(i).Height = maxRowHeight
                Else
                    .Rows(i).Height = rowHeights(i)
                End If
            Next
        End With
    End Sub


    Private Sub DataGridView1_EditingControlShowing(
    sender As Object, e As DataGridViewEditingControlShowingEventArgs) _
    Handles DataGridViewEx1.EditingControlShowing

        Dim editingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
        If editingControl IsNot Nothing Then
            editingControl.ReadOnly = True
            If editingControl.Multiline Then
                editingControl.ScrollBars = ScrollBars.Vertical
            Else
                editingControl.ScrollBars = ScrollBars.None
            End If
        End If
    End Sub


End Class

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103182 ] / ▼[ 103184 ]
■103183 / 17階層)  Re[17]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (462回)-(2024/06/16(Sun) 17:02:49)
2024/06/16(Sun) 17:13:44 編集(投稿者)

No103182 (かんぽ さん) に返信
> DataGridViewExを宣言した上で、
> フォーム上にDataGridViewExを一つだけ配置し、
> 以下を実行していますが、
> 想定通りの挙動にはなりません。
> どこを修正すればよろしいでしょうか?


AdjustRowHeight も DataGridView1_EditingControlShowing も DataGridViewEx の中でやっているので
Form1_Load だけあればよいです。(AdjustRowHeight を呼び出している行は削除)

実行したら

Column1
A1
A2
A3
A4
A5
の状態になっているはず。
この状態でセルをクリックすると、セルの中にスクロールバーが出てきてセルの中身がスクロールできるようになってます。

[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103183 ] / ▼[ 103185 ] ▼[ 103186 ]
■103184 / 18階層)  Re[18]: DataGridViewのスクロールバーの設定
□投稿者/ かんぽ (7回)-(2024/06/16(Sun) 21:33:30)
ありがとうございます。

セルをクリックしないと表示されないのですね。
それであればうまくいきました。

しかし、できれば、右端の大きなスクロールバーを連続的に動かせるようにした方が便利だと思います。
そのようなことは難しいでしょうか?


[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103184 ] / 返信無し
■103185 / 19階層)  Re[19]: DataGridViewのスクロールバーの設定
□投稿者/ KOZ (463回)-(2024/06/17(Mon) 02:14:58)
2024/06/17(Mon) 02:52:36 編集(投稿者)

No103184 (かんぽ さん) に返信
> しかし、できれば、右端の大きなスクロールバーを連続的に動かせるようにした方が便利だと思います。
> そのようなことは難しいでしょうか?

私は次善策と思える方法を提案しています。

DataGridView のスクロールバーは1行単位でしか動きませんし、セルの描画ロジックも1行単位のスクロールを想定してコードが書かれているので、とくまさんが提案したように複数行を1行にみせかけないとダメです。

コードが複雑になりますが、頑張って記述してください、
[ 親 103142 / □ Tree ] 返信 編集キー/

▲[ 103184 ] / 返信無し
■103186 / 19階層)  Re[19]: DataGridViewのスクロールバーの設定
□投稿者/ とくま (8回)-(2024/06/17(Mon) 10:23:22)
No103184 (かんぽ さん) に返信
デジタルでバーチャルな世界の話なんだから、1の次は2で、1.5や1.7は最初から存在しないです。
スクロールバーも1,2,3...と動いているのを脳が勝手に補完して連続しているように錯覚しているだけ。
1.7で止めたところで何も描画されないです。
自分の中では2,3年プログラムしてれば行きつきそうな結論なんだけど、最近は出来合いのものが
充実して、メタい考え方しなくなってきてるのかなぁ。そんな中間の描画処理まで入れたら重くなる
だけだし、9割の顧客が使わないような作り込みを、企業がプログラム指示出すのか?給料に見合わなさ
過ぎて話にならないでしょ。
>しかし、できれば、右端の大きなスクロールバーを連続的に動かせるようにした方が便利だと思います。
総合的に見れば費用対効果が薄く、処理が重くなるなどのリスクの方が大きいため、マイナスな機能です。

そのままの設定でどうにかするなら、自前の描画処理を入れるのは必須だし、それを面倒だと
思う(もしくは費用に見合わないプログラム)なら、必要なデータが表示できるだけの DataGridView
のサイズを確保するよう折衝するのも SE の仕事となってきます。

まぁ、この質問はただの趣味プログラムの話かもしれないし、蛇足ではありますが。

[ 親 103142 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -