3

如何在表单中定位按钮,使其始终位于 DevExpress 网格中的列上方?

网格列已设置为无法调整大小,但网格和列会随表单调整大小。System.Forms.Control具有看起来会提供此功能的PointToScreen 方法,但不是 DevExpress gridviewcolumn 中的方法。

4

1 回答 1

2

您可以找到相对于 的列坐标,GridControl然后转换为Form坐标。为此,您可以使用GridColumnsInfo可以从GridViewInfo.ColumnsInfo属性中获取的对象。要获取GridViewInfo对象,您可以使用gridView.GetViewInfo()方法。
找到坐标后,您将需要订阅发生在不同GridViewGridControl变化的事件。例如,您可以订阅GridView.LayoutGridView.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();
}

您可以为您订阅的每个事件调用此方法。

于 2014-06-12T10:16:59.653 回答