我需要显示我的ListViewItems的整个Text(未截断)

时间:2012-04-03 23:10:45

标签: c# .net winforms listview listviewitem

我正在显示的ListViewItems,在ListView中的ListView组中进行分类,只显示它们的Text属性,并在此处被截断(即使它们是特定组中的唯一项目,并且有一英亩和公顷的屏幕真实可用的房地产)。

我希望他们确实显示他们的Text属性,但完整地,不会被截断。

我以这种方式分配ListViewItem文本属性:

public LegacyApplication(String AAppName, String ATitle, String ADesc, String AIconFileName, String APathOfExe) {
  . . .
  base.Text = ATitle;
  . . .
}

我做错了什么或做错了什么?是否有一些我不知道的属性会控制ListViewItem上文本的外观?

6 个答案:

答案 0 :(得分:2)

不确定这是否适用于您的情况,但也许您可以尝试使用the AutoResizeColumn method;设为ColumnContent

答案 1 :(得分:2)

Windows资源管理器还为修剪文本设置工具提示,它还使用ListView控件。您可以通过处理MouseMove事件并使用ListView.GetItemAt(...)来查找鼠标正在移动的项目来模仿其行为。或者你可以使用ItemMouseHover事件,但我发现MouseMove更加用户友好,因为用户不必实际悬停并等待工具提示弹出....

我使用以下逻辑来模仿Windows资源管理器行为(此示例只是一个草稿,可能包含错误):

     //get the item at the current mouse location.
     ListViewItem item = myListView.GetItemAt(e.X, e.Y);
     if (item != null)
     {
        using (Graphics graphics = this.myListView.CreateGraphics())
        {
           var itemTextWidth = graphics.MeasureString(item.Text, item.Font).Width;
           if (itemTextWidth > myListView.Width)
           {
              if (!item.Equals(itemsToolTip.Tag) && !itemsToolTip.Active)
              {
                 //Set the tooltip , tag it with the item and set it as active ... 
              }
              // Adjacent ' text trimmed' list view items.  
              else if (!item.Equals(itemsToolTip.Tag))
              {
                 //set the tooltip as none active.
              }
           }
           else//None trimmed list view items.
           {
              //clear the tooltip and set it as none active
           }
        }
     }
     else
     {
        //clear the tooltip and set it as none active
     }
  }

答案 2 :(得分:2)

我知道这是一个古老的问题,但我确信Dr.Wilys对AutoResizeColumn的回答应该是在正确的道路上,所以稍微探讨一下......

将输出写入listview后(我的是批量sql server操作的输出)我更新了listview(这里,lstResults),因此:

.ui-datepicker {
  z-index: 10!important;
}

这对我有用... NB我的观点类型是详细信息,我没有尝试过其他人。

答案 3 :(得分:1)

如果你想在ListView中使用多行文本,请查看ObjectListView(围绕.NET WinForms ListView的开源包装)。这解决了所有者绘图(以及其他ListView烦恼)所涉及的许多问题。

我将此作为评论,但它是答案,并有一个可爱的截图:Multi-line list items on WinForms ListView control?

如果您有任何疑虑,请参阅后续行动: How to wordWrap the text in a column using ObjectListView

答案 4 :(得分:1)

我发现最好的解决方案是使用View = View.Tile。

这显示了大部分文字;我的解决方法是将文本分配给每个项目的工具提示,这样在完整文本仍未显示的情况下,用户可以将鼠标悬停在视线中。

答案 5 :(得分:1)

@Ahmad答案的充实版本(使用不适合的项目的工具提示):

    void SetTooltipForNonFittingItems(ListView listView)
    {
        var tooltip = new ToolTip();
        listView.MouseMove += (_1, e) =>
        {
            ListViewItem item = listView.GetItemAt(e.X, e.Y);
            if (item != null)
            {
                using (Graphics graphics = listView.CreateGraphics())
                {
                    var itemTextWidth = graphics.MeasureString(item.Text, item.Font).Width;
                    if (itemTextWidth > listView.Width)
                    {
                        if (!item.Equals(tooltip.Tag))
                        {
                            tooltip.Active = true;
                            tooltip.Tag = item;
                            // as written, the tooltip covers the item
                            // if you prefer to show it at the location of the cursor,
                            // use listView.PointToClient(Cursor.Position)
                            tooltip.Show(item.Text, listView, item.Position);
                        }
                    }
                    else
                    {
                        tooltip.Tag = null;
                        tooltip.Active = false;
                    }
                }
            }
            else
            {
                tooltip.Tag = null;
                tooltip.Active = false;
            }
        };
    }