[c#] Wie kann ich für jedes Element in einer Listbox einen anderen Tooltip-Text festlegen?



Answers

Mit dem MouseMove-Ereignis können Sie den Index des Elements, über dem sich die Maus befindet, verfolgen und in einer Variablen speichern, die ihren Wert zwischen MouseMoves behält. Jedes Mal, wenn MouseMove ausgelöst wird, überprüft es, ob der Index geändert wurde. Ist dies der Fall, wird die QuickInfo deaktiviert, der QuickInfo-Text für dieses Steuerelement geändert und anschließend erneut aktiviert.

Im Folgenden sehen Sie ein Beispiel, in dem eine einzelne Eigenschaft einer Car-Klasse in einer ListBox angezeigt wird, aber dann die vollständigen Informationen angezeigt werden, wenn Sie über einer beliebigen Zeile verweilen. Damit dieses Beispiel funktioniert, benötigen Sie lediglich eine ListBox namens lstCars mit einem MouseMove-Ereignis und eine QuickInfo-Textkomponente mit dem Namen tt1 in Ihrem WinForm.

Definition der Fahrzeugklasse:

    class Car
    {
        // Main properties:
        public string Model { get; set; }
        public string Make { get; set; }
        public int InsuranceGroup { get; set; }
        public string OwnerName { get; set; }
        // Read only property combining all the other informaiton:
        public string Info { get { return string.Format("{0} {1}\nOwner: {2}\nInsurance group: {3}", Make, Model, OwnerName, InsuranceGroup); } }
    }

Formularladeereignis:

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Set up a list of cars:
        List<Car> allCars = new List<Car>();
        allCars.Add(new Car { Make = "Toyota", Model = "Yaris", InsuranceGroup = 6, OwnerName = "Joe Bloggs" });
        allCars.Add(new Car { Make = "Mercedes", Model = "AMG", InsuranceGroup = 50, OwnerName = "Mr Rich" });
        allCars.Add(new Car { Make = "Ford", Model = "Escort", InsuranceGroup = 10, OwnerName = "Fred Normal" });

        // Attach the list of cars to the ListBox:
        lstCars.DataSource = allCars;
        lstCars.DisplayMember = "Model";
    }

Der Tooltip-Code (einschließlich der Erstellung der Klassen-Level-Variablen mit dem Namen "hoveredIndex"):

        // Class variable to keep track of which row is currently selected:
        int hoveredIndex = -1;

        private void lstCars_MouseMove(object sender, MouseEventArgs e)
        {
            // See which row is currently under the mouse:
            int newHoveredIndex = lstCars.IndexFromPoint(e.Location);

            // If the row has changed since last moving the mouse:
            if (hoveredIndex != newHoveredIndex)
            {
                // Change the variable for the next time we move the mouse:
                hoveredIndex = newHoveredIndex;

                // If over a row showing data (rather than blank space):
                if (hoveredIndex > -1)
                {
                    //Set tooltip text for the row now under the mouse:
                    tt1.Active = false;
                    tt1.SetToolTip(lstCars, ((Car)lstCars.Items[hoveredIndex]).Info);
                    tt1.Active = true;
                }
            }
        }
Question

Ich habe ein Listenfeld, das mit einer Sammlung von Objekten verbunden ist. Das Listenfeld ist so konfiguriert, dass eine Bezeichnereigenschaft für jedes Objekt angezeigt wird. Ich möchte eine QuickInfo mit Informationen anzeigen, die speziell für das Element in der Listbox, über die man schwebt, statt für einen Tooltip für die Listbox als Ganzes.

Ich arbeite in WinForms und habe dank einiger hilfreicher Blog-Posts eine ziemlich schöne Lösung zusammengestellt, die ich teilen wollte.

Ich wäre daran interessiert zu sehen, ob es andere elegante Lösungen für dieses Problem gibt, oder wie dies in WPF getan werden kann.




Sie können diesen einfachen Code verwenden, der das onMouseMove-Ereignis von ListBox in WinForms verwendet:

private void ListBoxOnMouseMove(object sender, MouseEventArgs mouseEventArgs)
{
        var listbox = sender as ListBox;
        if (listbox == null) return;

        // set tool tip for listbox
        var strTip = string.Empty;
        var index = listbox.IndexFromPoint(mouseEventArgs.Location);

        if ((index >= 0) && (index < listbox.Items.Count))
            strTip = listbox.Items[index].ToString();

        if (_toolTip.GetToolTip(listbox) != strTip)
        {
            _toolTip.SetToolTip(listbox, strTip);
        }
}

Natürlich müssen Sie das ToolTip-Objekt im Konstruktor oder in einer Init-Funktion initalisieren:

_toolTip = new ToolTip
{
            AutoPopDelay = 5000,
            InitialDelay = 1000,
            ReshowDelay = 500,
            ShowAlways = true
};

Genießen!




Mithilfe des title-Attributs können Sie den Tooltip für die einzelnen Listenelemente in einem Listenfeld festlegen.

Wiederholen Sie dies für alle Elemente in einem Listenfeld.

ListItem li = new ListItem("text","key");
li.Attributes.Add("title","tool tip text");

Hoffe das hilft.




Links