【问题标题】:How can I set an icon for a ListViewSubItem?如何为 ListViewSubItem 设置图标?
【发布时间】:2010-12-25 16:52:52
【问题描述】:

在 ListView 中,您可以在每个项目上添加图标。
在详细信息模式下查看时,图标显示在最左侧的列中。

我可以在其他列中显示一个图标吗?

【问题讨论】:

    标签: c# .net winforms listview listviewitem


    【解决方案1】:

    对此没有 .NET 支持。

    Have a look at this project.

    【讨论】:

      【解决方案2】:

      从 ListView 继承并绘制自己的图标。

      public class MyListView : ListView
      {
          protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e)
          {
              base.OnDrawSubItem(e);
          }
      }
      

      【讨论】:

        【解决方案3】:

        ListView 控件本身不支持子项中的图像。最简单的方法是切换到DataGridView 并使用DataGridViewImageColumn。如果这不可能,那么您需要使用ListView 控件中的自定义绘制支持自己绘制图标。为此,请设置 ListView.OwnerDraw = true 并处理 ListView.DrawSubItemListView.DrawColumnHeader 事件。

        private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
        {
            // Only interested in 2nd column.
            if (e.Header != this.columnHeader2)
            {
                e.DrawDefault = true;
                return;
            }
        
            e.DrawBackground();
            var imageRect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height);
            e.Graphics.DrawImage(SystemIcons.Information.ToBitmap(), imageRect);
        }
        
        private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
        {
            e.DrawDefault = true;
        }
        

        【讨论】:

        • 为什么不只是 var imageRect = e.Bounds; 它是一种值类型,所以值将被复制而不是被引用,这样可以安全地处理它们。
        • 展示,在实际使用中,您可能需要调整 imageRect 以考虑对齐、填充和/或子项中包含的其他内容。
        【解决方案4】:

        使用 P/Invoke 并发送LVM_SETITEM 消息到列表视图(您应该在控件创建时或通过 LVM_SETEXTENDEDLISTVIEWSTYLE 设置 LVS_EX_SUBITEMIMAGES 样式),指定子项索引和相应的图像索引。您需要为插入的每个列表项执行此操作。

        【讨论】:

          【解决方案5】:

          ObjectListView 是一个围绕 .NET Winforms ListView 的开源包装器。它使用@ligget78 提到的 p/invoke 策略支持子项上的图像。它还解决了 ListView 的许多其他常见问题。

          它可以让你用最少的努力制作非常漂亮的 ListView:


          (来源:sourceforge.net

          【讨论】:

            【解决方案6】:

            抢在这个:

            http://social.msdn.microsoft.com/forums/en-US/winforms/thread/d25b4ffa-2ea4-43cd-a3ae-8dd0387197ae/

            除了接受的答案之外,您还应该处理 DrawItem 事件,否则它将不起作用。

            【讨论】:

              【解决方案7】:

              图标显示在“第一”列,这也是键盘前缀搜索的基础。一种可能的解决方案是通过将第一列的 DisplayIndex 设置为其他值来重新排序列。

              listView1.Columns[0].DisplayIndex = 1;
              

              这当然只有在您只需要一列中的图标时才有效。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-08-27
                • 2013-03-17
                • 1970-01-01
                • 2016-01-21
                • 2013-02-02
                • 1970-01-01
                • 2013-08-15
                相关资源
                最近更新 更多