我怎样才能从列标题中删除排序标志符号中的DataGridView不删除其排序功能。
我工作在C#Windows窗体应用程序,我想生成一个DataGridView,其中datagridview的列宽将在报告中列分配报告,其中作为在DataGridView列包括与排序标志符号,那是在我的情况下不必要的空间,我想从的columnHeader排除。
我怎样才能从列标题中删除排序标志符号中的DataGridView不删除其排序功能。
我工作在C#Windows窗体应用程序,我想生成一个DataGridView,其中datagridview的列宽将在报告中列分配报告,其中作为在DataGridView列包括与排序标志符号,那是在我的情况下不必要的空间,我想从的columnHeader排除。
这其实是很容易的使用自定义单元格画做。
所有你需要做的就是处理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;
}
}
}
你不能做它的WinForms,除非你写一个自定义数据网格视图,以满足您的需求,我会说你需要矫枉过正。
UPDATE
我已经创建自定义的进度条到按键上,而以帆布的控制,但没有做一个自定义数据网格视图。 这就是说,这是我做这个的想法...
你基本上是创建一个新的UserControl
,并添加一个正常的DataGridView给它,并删除头。 现在添加DataGridControl上述面板“作用”在列标题。 你必须处理像所有的事件,点击标题对,调整他们调整列,并呼吁在DataGridView方法做同样的。
如果你想隐藏的列标题,当用户向下滚动的效果,你必须做手工,以及。
对不起,我不能给你一个比这坚实的起点。 如果你是新来创建自定义的控制,尝试创建一个自定义按钮,(例如:是左侧有一个图像),或者一个进度条,这也显示在它的中间的进度百分比。 你会得到一个关于你可以做什么的感觉。
如果你使用WPF,我觉得这样的事情可以很容易地完成。
试图让右对齐标题文本与单元格的内容来排队时,我打了同样的问题(看起来在一排数字傻此时的标题文字是不是也完全正确对齐。)我在其他DGV的,这是可能的发现挤出字形。
反正真正简单的解决方案,填写标题文字与领先的空间,头部细胞包裹模式设置为false。 例:
dgv.Columns["Width"].HeaderText = " Width";
dgv["Width"].HeaderCell.Style.WrapMode = DataGridViewTriState.False;
可能需要一点玩耍,以获得正确的前导空格的数量,但结果是令人愉快的。 (不知道如果它与尾部的空格,为时已晚,晚上去尝试的作品。)