【问题标题】:Unable to hide cells border of particular column in the UltraGrid无法隐藏 UltraGrid 中特定列的单元格边框
【发布时间】:2020-11-21 21:36:52
【问题描述】:

我添加了drawfilter,通过将边框样式设置为none并删除了单元格的边框来隐藏ultragrid中特定列的单元格。但边界仍然可见。不知道我错过了什么。

class MyDrawFilter : IUIElementDrawFilter
{
    DrawPhase IUIElementDrawFilter.GetPhasesToFilter(ref UIElementDrawParams drawParams)
    {
        if (drawParams.Element is CellUIElement)
        {
            UltraGridCell myCell = drawParams.Element.GetContext(typeof(UltraGridCell)) as UltraGridCell;

            if (myCell.Column.Key == "col1")
            {
                return Infragistics.Win.DrawPhase.BeforeDrawBorders;
            }
            return DrawPhase.None;
        }
        return DrawPhase.None;
    }

    bool IUIElementDrawFilter.DrawElement(DrawPhase drawPhase, ref UIElementDrawParams drawParams)
    {
        Border3DSide border = drawParams.Element.BorderSides;
        border &= ~Border3DSide.Middle;
        border &= ~Border3DSide.Right;
        drawParams.DrawBorders(UIElementBorderStyle.None, border);
        return true;

    } 
}

【问题讨论】:

  • “隐藏特定列的单元格”是什么意思?你想隐藏单元格的边框,特别是一列吗?
  • 是的..需要隐藏特定列的边框

标签: c# winforms infragistics ultrawingrid


【解决方案1】:

下面的自定义DrawFilter 为UltraGrid 中除已定义列之外的所有单元格绘制边框:

public class NoRowBorderDrawFilter : IUIElementDrawFilter
{
    public bool DrawElement(DrawPhase drawPhase, ref UIElementDrawParams drawParams)
    {
        switch (drawPhase)
        {
            case DrawPhase.BeforeDrawBorders:                   
                break;

            case DrawPhase.AfterDrawElement:
                if (drawParams.Element is RowCellAreaUIElement aCellUIElement)
                {
                    var cElements = aCellUIElement.ChildElements;
                    for (int i = 0; i < cElements.Count; i++)
                    {
                        if (cElements[i] is CellUIElement cui && cui.Column.Key != "HardDrive")
                        {
                            drawParams.DrawBorders(UIElementBorderStyle.Dotted, Border3DSide.Bottom, Rectangle.Inflate(cui.Rect, 0, 0));
                        }
                    }
                }
                break;
        }
        return true;
    }

    public Infragistics.Win.DrawPhase GetPhasesToFilter(ref Infragistics.Win.UIElementDrawParams drawParams)
    {           
        return (drawParams.Element is RowCellAreaUIElement) 
            ? DrawPhase.AfterDrawElement | DrawPhase.BeforeDrawBorders 
            : DrawPhase.None;        
    }
}

这里的技巧是使用DrawPhase.AfterDrawElement 来绘制行边框。

当上面定义的过滤器应用来自某些 Infragistics 示例的UltraGrid 时,控件如下面的屏幕截图所示(过滤后的列标记为红色):

【讨论】:

    【解决方案2】:

    每个单元格绘制其左右边框。您的代码正确地删除了col1 中单元格的边框,但它没有删除其相邻单元格的边框。所以如果你有这样的表:

    |col1 |col2 |col3 |col4 |

    |单元格1|单元格2|单元格3|单元格3|

    而你需要去掉cell2的左右边框你需要:

    • 删除 cell1 的右边框。
    • 去掉cell2的左右边框。
    • 删除单元格 3 的左边框。

    注意顶部和底部边框来自RowCellAreaUIElement。如果您需要移除这些边框,您应该操作这些元素。

    这是网格的元素树的样子

    UltraGridUIElement - this is the entire grid
        DataAreaUIElement - this is where the data is shown
            RowColRegionIntersectionUIElement - this is where scrollbars will appear
                RowUIElement - this is where row is drawn
                    RowSelectorUIElement - row selectors if any
                    RowCellAreaUIElement - cells container - this element draws most left, most right and top and bottom borders of the row
                        CellUIElement - cell - this draw left and right cell borders
                        CellUIElement
                        CellUIElement
                        CellUIElement
                    RowCellAreaUIElement
                        CellUIElement
                        CellUIElement
                        CellUIElement
                        CellUIElement
    

    所以你有CellUIElement 负责绘制左右单元格边框。然后RowCellAreaUIElement 负责同时绘制单元格的上下边框,以及绘制第一个单元格的左边框和最后一个单元格的右边框。

    【讨论】:

    • 感谢@wnvko 的回复。 col 1 的边框没有完全隐藏。我仍然可以看到边框是浅灰色的。
    • @payal 如果这是第一个单元格左边框,以及最后一个单元格右边框,则来自 RowCellAreaUIElement。您也应该删除此元素的左边框或右边框。我将使用边框绘制中涉及的所有元素更新我的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多