获取网格列的位置

时间:2008-12-17 20:19:58

标签: c# forms devexpress controls

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

Grid列已设置为无法调整大小,但网格和列将使用表单重新调整大小。 System.Forms.ControlPointToScreen method看起来像提供此功能,但不是DevExpress gridviewcolumn中的方法。

1 个答案:

答案 0 :(得分: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();
}

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