![](/img/trans.png)
[英]How to align Column Header Text in to left Datagridview Windows Form C#
[英]Align the text of a Listview Column in Windows Forms C# to right without changing the header text alignment
我在Win7上的C#2008(Net 2.0)中有一个系统Windows窗体ListView,它有4列,并且处于详细模式,带有小图标,fullrowselection on,hideselection false,showtooltips true。
第3列应作为唯一的列与右侧对齐而不是与其他列对齐。 我已将相应的designer-property设置为textalignment right,这是合乎逻辑的。 但微软在这里几乎没有让人失望:微软Visual Studio也将列标题与我不想要的权利排列在一起! 只有所有元素都应在第3列中对齐,所有列的标题文本都将保持对齐。 这似乎是设计师设置无法实现的。
我在谷歌长时间搜索并发现了这个 - 代码对齐我的项目我想要的方式,但项目文本消失并再次出现,突出显示和选择不起作用,ListView消失部分或整体,文本呈现奇怪,喜欢不锐利等等 - 在我应用下面的代码后,ListView停止了默认行为。 如果没有这个麻烦我怎么能解决这个问题(Ownerdraw将下面的代码设置为true。我有Fullrowselect,hideselection false和detailsmode on)。 基本上我只需要按照我的意愿对第3列中的子项进行对齐,而不改变列标题文本对齐,所有其他都应该是默认绘图 - 我不想改变任何绘图 - 只有对齐应该是我自定义的一个我描述的以上。
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
TextFormatFlags flags = TextFormatFlags.Left;
if (e.ColumnIndex == 3)
{
flags = TextFormatFlags.Right;
e.DrawText(flags);
}
else
{
e.DrawDefault = true;
}
}
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
e.DrawDefault = true;
}
相反绘制的ColumnHeader
为默认值,而自己绘制的所有项目,为什么不画的所有项目的默认,绘制ColumnHeader
自己呢? 我已经尝试过这段代码但是当鼠标结束时ColumnHeader
的外观和感觉并不好,它不像ColumnHeader
的默认外观,为了使它看起来类似,我相信我们需要更多的代码,不过因为我使用的颜色非常相似,所以没有太大的不同。 您可以花更多时间来自定义它。 这只是一个演示:
public Form1(){
InitializeComponent();
listView1.OwnerDraw = true;
invalidateHeaders = typeof(ListView).GetMethod("InvalidateColumnHeaders",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
}
bool hot;
System.Reflection.MethodInfo invalidateHeaders;
//DrawColumnHeader event handler
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
if (e.Header.TextAlign == HorizontalAlignment.Right) {
e.DrawBackground();
e.DrawText(TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter);
if (e.Bounds.Contains(listView1.PointToClient(MousePosition))) {
bool selected = (e.State & ListViewItemStates.Selected) != 0;
var solidColor = selected ? Color.FromArgb(30, Color.FromArgb(0, 200, 200)) :
Color.FromArgb(30, Color.Aqua);
var borderColor = selected ? Color.DarkGray : Color.Aqua;
e.Graphics.FillRectangle(new SolidBrush(solidColor), e.Bounds);
var rect = e.Bounds;
rect.Width -= 2;
rect.Height -= 2;
ControlPaint.DrawBorder(e.Graphics, rect,
Color.FromArgb(40, borderColor), ButtonBorderStyle.Solid);
hot = true;
}
else hot = false;
} else {
e.DrawDefault = true;
if (hot) {
invalidateHeaders.Invoke(listView1, null);
hot = false;
}
}
}
//DrawItem event handler
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) {
e.DrawDefault = true;
}
//MouseMove event handler
private void listView1_MouseMove(object sender, MouseEventArgs e) {
invalidateHeaders.Invoke(listView1, null);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.