如何在不删除其排序功能的情况下从DataGridView中的列标题中删除排序字形。
我正在使用C#中的windows表单应用程序,我想从datagridview生成报表,其中datagridview列宽将在报表列中指定,其中DataGridView列包含排序标志符号,这是我的不必要的空间case,我想从ColumnHeader中排除它。
答案 0 :(得分:4)
使用自定义单元格绘画实际上很容易做到。
您需要做的就是处理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
的{{1}}事件中设置宽度:
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
答案 1 :(得分:1)
你不能在WinForms中做到这一点,除非你编写一个自定义数据网格视图来满足你的需求,我会说这对你的要求有些过分。
<强>更新强>
我已经为按钮,画布控件创建了自定义进度条,但没有创建自定义数据网格视图。那就是说,这是我做这个的想法......
你基本上创建一个新的UserControl
,并向其添加一个普通的DataGridView,并删除标题。现在添加DataGridControl上方的面板,该面板在列标题处“起作用”。您必须处理所有事件,例如,单击标题进行排序,调整大小以调整列的大小,并调用DataGridView上的方法来执行相同的操作。
如果您想要在用户向下滚动时隐藏列标题的效果,您也必须手动执行此操作。
对不起,我不能给你一个坚实的起点。如果您不熟悉创建自定义控件,请尝试创建自定义按钮(例如:左侧有图像)或进度条,它还会在其中间显示进度百分比。你会对你能做什么有所了解。
如果你正在使用WPF,我认为这样的事情很容易实现。
答案 2 :(得分:0)
我试图获得正确对齐的标题文本以与单元格内容对齐时遇到了同样的问题(在一行数字中看起来很傻,标题文本也没有完全正确对齐。)我在其他dgv中注意到它有可能挤出字形。
无论如何都是简单的解决方案,用前导空格填写标题文本,并将标题单元格换行模式设置为false。例如:
dgv.Columns["Width"].HeaderText = " Width";
dgv["Width"].HeaderCell.Style.WrapMode = DataGridViewTriState.False;
可能需要花一点时间才能获得前导空格的数量,但结果令人满意。 (Dunno如果它与尾随空间一起工作,那么太晚才能尝试。)