投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/8/10 10:44:57
> TextBoxとMSFlexGridのエラーで以下のものがありましたが意味がいまいちわからないです。
> 分かる方いらっしゃいますか?
一応説明しておくと:

> textbox.Left = MSFlexGrid.CellLeft + MSFlexGrid.Left
> textbox.Top = MSFlexGrid.CellTop + MSFlexGrid.Top
> textbox.Width = MSFlexGrid.CellWidth
> textbox.Height = MSFlexGrid.CellHeight

CellLeft, CellTop, CellWidth, CellHeight は、
Col, Row で示される現在のセルの座標とサイズを示します。
http://hanatyan.sakura.ne.jp/vbhlp/msfgrefe.htm

その座標は MSFlexGrid に対する相対座標なので、
MSFlexGrid 自体の Left , Top プロパティを加算することで、
コンテナ(Form や Frame など)から見た座標に変換しています。

VB6 の場合、この座標系は既定では Twips 単位系ですが、
.NET では Pixel 単位系です。そのため、マイグレーション時には
TwipsToPixelsX や TwipsToPixelsY といった互換メソッドを用いて変換されます。



さて、DataGridView の場合は、セルの座標を知るために
GetCellDisplayRectangle メソッドで測定できます。

Dim pos = DataGridView1.CurrentCellAddress
TextBox1.Visible = (pos.X >= 0 AndAlso pos.Y >= 0)
If Not TextBox1.Visible Then Return

Dim cutOverflow = True '溢れた領域を切り捨てるかどうか 
Dim r As Rectangle = DataGridView1.GetCellDisplayRectangle(pos.X, pos.Y, cutOverflow)

TextBox1.SetBounds(r.Left, r.Top, r.Width, r.Height)


ここで取得されるセル座標は、VB6 の時と同様に
DataGridView から見た相対座標となりますが、Form の Load 時などに
 TextBox1.Parent = DataGridView1
などとして、TextBox を DataGridView の上に直接貼ってしまえば、座標の調整が不要です。
こうすると、現在のセルが画面外までスクロールしていた場合などにも対処しやすいです。


なお、TextBox の高さは、通常はフォント依存で固定ですが、
Load イベントなどで、隠しプロパティの
 TextBox1.AutoSize = False
を設定しておくと、高さを変更できるようになります。


…とはいえ、これが良い方法ではないことは先に述べた通り。
DataGridView の EditMode を EditOnEnter あたりにしておけば、
自動的に編集機能が使えるわけですからね。
https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=41019&forum=7

セルタイプにはテキストボックス型だけでなく、ドロップダウンリスト型や
チェックボックス型、ボタン型、画像型、ハイパーリンク型が選べます。

それ以外のコントロールで編集したい場合は、おととい 8 日に紹介した
> [How to: Windows フォーム DataGridView Cells でコントロールをホストする]
> https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/how-to-host-controls-in-windows-forms-datagridview-cells
を参照してみてください。