0

我有一个ListView使用所有者绘图为某些子项目绘制附加内容的方法。

我发现因为这个额外的内容占用了一些额外的空间,所以列表视图现在错误地计算了列“自动调整大小”的宽度,因此当有人自动调整某些列的大小(例如,通过双击列调整大小句柄)时,列已调整大小以使其太小,并且该列表视图中的文本在末尾用括号 (...) 呈现。

有没有一种方法可以提示列表视图询问我在自动调整大小期间列的大小应该是多少?

4

2 回答 2

1

没有一条消息可以告诉您何时要自动调整列的大小。但正如您所提到的,用户只能通过两种方式触发它:双击分隔线和Ctrl-Shift-+. 你可以拦截这两个,然后做任何你喜欢的事情。

步骤#1:要拦截双击,您需要子类ListView化并监听HDN_DIVIDERDBLCLICK通知:

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case 0x4E: // WM_NOTIFY
            if (!this.HandleNotify(ref m))
                base.WndProc(ref m);
            break;
        default:
            base.WndProc(ref m);
            break;
    }
}

protected bool HandleNotify(ref Message m) {

    const int HDN_DIVIDERDBLCLICKW = (HDN_FIRST - 25);

    NativeMethods.NMHEADER nmheader = (NativeMethods.NMHEADER)m.GetLParam(typeof(NativeMethods.NMHEADER));

    switch (nmheader.nhdr.code) {

        case HDN_DIVIDERDBLCLICKW:
            if (nmheader.iItem >= 0 && nmheader.iItem < this.Columns.Count) {
                this.AutoResizeColumn(nmheader.iItem);
                m.Result = (IntPtr)1; // prevent the change from happening
                return true;
            }
            break;

        default:
            break;
    }

    return false;
}

当然,您必须实施AutoResizeColumn()才能做您想做的事。

第2步。要拦截 Ctrl-Shift-+,您需要覆盖ProcessKeyPreview. 本文将向您展示如何做到这一点。在您的覆盖中,您将调用AutoResizeColumn()每一列。

替代方法

如果您构造您ListViewItems的每个子项是一个与您想要拥有的数据相同长度的“W”字符串,则控件将使用这些字符串来自动计算该列。这可能是一种更简单的方法。

于 2012-05-30T08:08:47.383 回答
0

您可以在以下两个场景中手动执行此操作:


  • 如果你想修复 aminimumWidthmaximumWidth,

    在以下情况下使用ColumnWidthChangingListView

   int minimumWidth = 200;
   int maximumWidth = 500;
   if (e.NewWidth  maximumWidth)
   {
      e.Cancel = true;
      e.NewWidth = maximumWidth;
   }

  • 如果要修复 a ColumnWidth,请ListViewColumn设置所需的ColumnWidth

    在以下情况下使用ColumnWidthChangingListView

   ListView ColumnList = sender as ListView;
   e.Cancel = true;
   e.NewWidth = ColumnList.Columns[e.ColumnIndex].Width;
于 2012-05-23T16:20:45.320 回答