winforms 组合框文本过长,无法完全显示

esyap4oy  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(131)

如图所示,在我的例子中,组合框文本非常长。
在不改变组合框宽度的情况下,当用户将鼠标悬停在组合框上时,是否有方法显示全文?


的数据

qrjkbowd

qrjkbowd1#

  • 在不改变组合框宽度的情况下,当用户悬停在组合框上时,是否有方法显示全文?*

当鼠标指针悬停在控件上时,可以使用ToolTip组件显示带有长文本的项。每当SelectedIndex更改时,通过TextRenderer.MeasureText方法测量选定项,如果字符串的宽度大于编辑框的宽度,则将长字符串设置为控件的工具提示。

注:EditBox的宽度= ComboBox.Width - ButtonWidth。您可以从SystemInformation.VerticalScrollBarWidth属性获取 ButtonWidth

为了应用这个特性,让我们创建一个小类并继承ComboBox控件。

C#

// +
// using System.ComponentModel;

[DesignerCategory("Code")]
public class ComboBoxEx : ComboBox
{
    private readonly ToolTip ttp;

    public ComboBoxEx() : base() => ttp = new ToolTip();

    private bool _showItemToolTip = true;
    [DefaultValue(true)]
    public bool ShowItemToolTip
    {
        get => _showItemToolTip;
        set
        {
            if (_showItemToolTip != value)
            {
                _showItemToolTip = value;
                ttp.SetToolTip(this, string.Empty);  
            }
        }
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        base.OnSelectedIndexChanged(e);

        if (ShowItemToolTip)
        {
            string str = string.Empty;

            if (SelectedIndex >= 0)
            {
                var sz = TextRenderer.MeasureText(Text, Font);

                if (sz.Width > Width - SystemInformation.VerticalScrollBarWidth)
                    str = Text;
            }

            ttp.SetToolTip(this, str);
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing) ttp.Dispose();
        base.Dispose(disposing);
    }
}

字符串

VB.Net

' +
' Imports System.ComponentModel

<DesignerCategory("Code")>
Public Class ComboBoxEx
    Inherits ComboBox

    Private ReadOnly ttp As ToolTip

    Sub New()
        MyBase.New
        ttp = New ToolTip()
    End Sub

    Private _showItemToolTip As Boolean = True
    <DefaultValue(True)>
    Public Property ShowItemToolTip As Boolean
        Get
            Return _showItemToolTip
        End Get
        Set(value As Boolean)
            If (_showItemToolTip <> value) Then
                _showItemToolTip = value
                ttp.SetToolTip(Me, String.Empty)
            End If
        End Set
    End Property

    Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)
        MyBase.OnSelectedIndexChanged(e)

        If ShowItemToolTip Then
            Dim str = ""

            If SelectedIndex >= 0 Then
                Dim sz = TextRenderer.MeasureText(Text, Font)

                If sz.Width > Width - SystemInformation.VerticalScrollBarWidth Then
                    str = Text
                End If
            End If

            ttp.SetToolTip(Me, str)
        End If
    End Sub

    Protected Overrides Sub Dispose(disposing As Boolean)
        If disposing Then ttp.Dispose()
        MyBase.Dispose(disposing)
    End Sub

End Class


如果你不想子类化,你可以使用同样的方法。删除一个ToolTip组件并处理ComboBox.SelectedIndexChanged事件,如上所示。

yjghlzjz

yjghlzjz2#

你可以在鼠标悬停时使用工具提示,或者你必须改变组合框的宽度,或者增加组合框的字体大小。

相关问题