【问题标题】:Can I FORCE the filter button to show on my DataGridViewColumnHeader?我可以强制过滤器按钮显示在我的 DataGridView 列标题上吗?
【发布时间】:2016-03-02 13:52:50
【问题描述】:

我有一个 C# WinForms DataGridView,默认情况下没有(也不能)启用过滤。结果是当我显示 DGV 时没有显示过滤按钮。

与使用 DataTable(在我的情况下不是一个选项)相反,我希望始终在我的标题单元格中显示一个右对齐的下拉按钮:

谁能指出我正确的方向?我可以强制呈现按钮吗?

提前致谢

【问题讨论】:

    标签: c# .net winforms datagridview datagridviewcolumn


    【解决方案1】:

    您可以创建一个继承自DataGridViewColumnHeaderCell 的自定义标题单元格。然后重写它的Paint 方法并在标题上绘制一个按钮。

    先调用base.Paint方法,然后在合适的位置绘制按钮。

    要绘制这样的按钮,您可以使用ButtonRenderer.DrawButton 并使用图片作为下拉菜单。您也可以使用ComboBoxRenderer.DrawDropDownButton 为您绘制下拉菜单。

    还要在网格中显示它,将自定义标题单元格的实例分配给所需列的 HeaderCell 属性:

    this.dataGridView1.Columns[0].HeaderCell = new FilterDataGridViewColumnHeader();
    

    上面的截图是用这段代码创建的:

    public class FilterDataGridViewColumnHeader : DataGridViewColumnHeaderCell
    {
        protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates dataGridViewElementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            ComboBoxRenderer.DrawDropDownButton(graphics, new System.Drawing.Rectangle(cellBounds.Right - 16, 4, 14, cellBounds.Height - 6), System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
        }
    }
    

    【讨论】:

    • 感谢一百万 @Reza。我希望完全避免使用 Paint 方法,但通过谷歌搜索我意识到这可能是要走的路。谢谢:-)
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2011-07-28
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多