如何删除datagridview的排序标志符号而不删除分类设施(How to remove sort

2019-09-21 03:33发布

我怎样才能从列标题中删除排序标志符号中的DataGridView不删除其排序功能。

我工作在C#Windows窗体应用程序,我想生成一个DataGridView,其中datagridview的列宽将在报告中列分配报告,其中作为在DataGridView列包括与排序标志符号,那是在我的情况下不必要的空间,我想从的columnHeader排除。

Answer 1:

这其实是很容易的使用自定义单元格画做。

所有你需要做的就是处理DataGridView CellPainting事件:

dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);

并在处理程序做这样的事情:

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex == -1)
    {
        e.Paint(e.CellBounds, DataGridViewPaintParts.All &~DataGridViewPaintParts.ContentBackground);

        e.Handled = true;
    }
}

上面的代码很简单-只要检查当前单元格是标题行(有-1指数)然后画以外的所有ContentBackground

我只查这在我的Windows 7机器上,它看起来不错,看起来内容背景是仅用于排序字形 - 你将要测试它的目标环境,以确保你不需要做任何更复杂的风俗画,以保持ContentBackground没有的字形。


头单元的宽度仍将包括用于字形的空间。 我一般会接受,因为改变这个变得有点凌乱,但如果你必须有宽度适合文本,然后像下面的工作。

先设置在宽度DataBindingComplete所述的事件DataGridView

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{        
    if (dataGridView1.AutoSizeColumnsMode == DataGridViewAutoSizeColumnsMode.AllCells)
    {
        // Loop over all the columns
        foreach (DataGridViewColumn c in dataGridView1.Columns)
        {
            // Work out the size of the header text
            Size s = TextRenderer.MeasureText(c.HeaderText, dataGridView1.Font);

            // Change the autosize mode to allow us to see if the header cell has the 
            // longest text
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
            if (s.Width + 10 > c.Width)
            {
                // If the header cell is longest we set the column width
                c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                c.Width = s.Width + 10;
            }
            else
            {
                // If the header cell is not longest, reset the autosize mode
                c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
        }
    }
}

一旦你这样做,你则需要仍然允许列自动调整,当细胞的文本比头长。

对于我使用的CellValueChanged事件:

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewColumn c = dataGridView1.Columns[e.ColumnIndex];

    if (c.AutoSizeMode == DataGridViewAutoSizeColumnMode.None)
    {
        Size s = TextRenderer.MeasureText(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), dataGridView1.Font);
        if (s.Width > c.Width)
        {
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
        }
    }

}


Answer 2:

你不能做它的WinForms,除非你写一个自定义数据网格视图,以满足您的需求,我会说你需要矫枉过正。

UPDATE

我已经创建自定义的进度条到按键上,而以帆布的控制,但没有做一个自定义数据网格视图。 这就是说,这是我做这个的想法...

你基本上是创建一个新的UserControl ,并添加一个正常的DataGridView给它,并删除头。 现在添加DataGridControl上述面板“作用”在列标题。 你必须处理像所有的事件,点击标题对,调整他们调整列,并呼吁在DataGridView方法做同样的。

如果你想隐藏的列标题,当用户向下滚动的效果,你必须做手工,以及。

对不起,我不能给你一个比这坚实的起点。 如果你是新来创建自定义的控制,尝试创建一个自定义按钮,(例如:是左侧有一个图像),或者一个进度条,这也显示在它的中间的进度百分比。 你会得到一个关于你可以做什么的感觉。

如果你使用WPF,我觉得这样的事情可以很容易地完成。



Answer 3:

试图让右对齐标题文本与单元格的内容来排队时,我打了同样的问题(看起来在一排数字傻此时的标题文字是不是也完全正确对齐。)我在其他DGV的,这是可能的发现挤出字形。

反正真正简单的解决方案,填写标题文字与领先的空间,头部细胞包裹模式设置为false。 例:

    dgv.Columns["Width"].HeaderText = "        Width";
    dgv["Width"].HeaderCell.Style.WrapMode = DataGridViewTriState.False;

可能需要一点玩耍,以获得正确的前导空格的数量,但结果是令人愉快的。 (不知道如果它与尾部的空格,为时已晚,晚上去尝试的作品。)



文章来源: How to remove sorting glyph in datagridview without removing Sorting facility