C# 将Windows窗体C中Listview列的文本向右对齐,而不更改标题文本对齐方式

C# 将Windows窗体C中Listview列的文本向右对齐,而不更改标题文本对齐方式,c#,winforms,listview,alignment,subitem,C#,Winforms,Listview,Alignment,Subitem,我在Win7上的C#2008(NET2.0)中有一个系统Windows窗体ListView,它有4列,处于详细信息模式,带有小图标、fullrowselection打开、hideselection为false、showtooltips为true 第3列应为唯一一列,与其他列一样向右对齐,而不是向左对齐。 我已将相应的设计器属性设置为textalignment right,这是符合逻辑的。 但是微软在这方面很难令人失望:微软Visual Studio也将专栏标题向右对齐,这是我不想要的!!! 在第

我在Win7上的C#2008(NET2.0)中有一个系统Windows窗体ListView,它有4列,处于详细信息模式,带有小图标、fullrowselection打开、hideselection为false、showtooltips为true

第3列应为唯一一列,与其他列一样向右对齐,而不是向左对齐。 我已将相应的设计器属性设置为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);
}