Длинный текст со списком, не может отображаться полностью

#winforms

#winforms

Вопрос:

Как показано на рисунке, текст со списком в моем случае очень длинный.

Существует ли какой-либо способ отображения полного текста при наведении на него курсора мыши без изменения ширины поля со списком?

введите описание изображения здесь

Ответ №1:

Существует ли какой-либо способ отображения полного текста при наведении на него курсора мыши без изменения ширины поля со списком?

Вы можете использовать ToolTip компонент для отображения элементов с длинным текстом при наведении указателя мыши на элемент управления. Всякий SelectedIndex раз, когда происходят изменения, измеряйте выбранный элемент с помощью TextRenderer.MeasureText метода, и если ширина строки больше, чем ширина окна редактирования, установите длинную строку в качестве всплывающей подсказки для элемента управления.


Примечание: ширина EditBox = со списком.Ширина — ButtonWidth. Вы можете получить ButtonWidth из SystemInformation.VerticalScrollBarWidth свойства.


Чтобы применить эту функцию, давайте создадим небольшой класс и унаследуем элемент 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 событие, как показано выше.