ボタンが常に DevExpress グリッドの列の上にくるように、フォーム内にボタンを配置するにはどうすればよいですか?
グリッド列はサイズ変更できないように設定されていますが、グリッドと列はフォームに合わせてサイズ変更されます。System.Forms.Controlには、この機能を提供するように見えるPointToScreen メソッドがありますが、DevExpress gridviewcolumn のメソッドではありません。
ボタンが常に DevExpress グリッドの列の上にくるように、フォーム内にボタンを配置するにはどうすればよいですか?
グリッド列はサイズ変更できないように設定されていますが、グリッドと列はフォームに合わせてサイズ変更されます。System.Forms.Controlには、この機能を提供するように見えるPointToScreen メソッドがありますが、DevExpress gridviewcolumn のメソッドではありません。
を基準とした列座標を見つけて、座標に変換できGridControl
ますForm
。このために、プロパティGridColumnsInfo
から取得できるオブジェクトを使用できGridViewInfo.ColumnsInfo
ます。GridViewInfo
オブジェクトを取得するには、gridView.GetViewInfo()
メソッドを使用できます。
座標を見つけたら、さまざまな場所で発生するイベントをサブスクライブする必要がGridView
ありGridControl
ます。たとえばGridView.Layout
、
GridView.LeftCoordChanged
イベントをサブスクライブできます。サイズを変更するには、イベントにサブスクライブする必要がありますGridControl.Resize
。
例:
private void UpdatePosition(GridView gridView, string columnName, Control control)
{
var column = gridView.Columns[columnName];
if (column == null) return;
var viewInfo = (GridViewInfo)gridView.GetViewInfo(); //using DevExpress.XtraGrid.Views.Grid.ViewInfo
var columnInfo = viewInfo.ColumnsInfo[column];
if (columnInfo != null)
{
var bounds = columnInfo.Bounds; //column's rectangle of coordinates relative to GridControl
var point = PointToClient(gridView.GridControl.PointToScreen(bounds.Location)); //translating to form's coordinates
control.Left = point.X;
control.Top = point.Y - control.Height;
control.Width = bounds.Width;
control.Show();
}
else
control.Hide();
}
サブスクライブしたすべてのイベントに対して、このメソッドを呼び出すことができます。