C#, 'C sharp'

 

 

Snippets 

Items in ListBox: toon item in tooltip indien te breed voor box.

Een aardig extraatje van deze oplossing is, dat dezelfde eventhandler aan alle listboxes in een applicatie kan worden gekoppeld, omdat de sender gebruikt wordt.

private int indexOfTooltippedItem = -1;

private void lst_MouseMove(object sender, MouseEventArgs e)
{
    ListBox lb = (ListBox)sender;
    int indexUnderTheMouse = lb.IndexFromPoint(e.X, e.Y);

    if (indexUnderTheMouse > -1 && indexUnderTheMouse != indexOfTooltippedItem)
    {
        Graphics g = lb.CreateGraphics();
        string itemtext = lb.Items[indexUnderTheMouse].ToString();
        
        if (g.MeasureString(itemtext, lb.Font).Width > lb.ClientRectangle.Width)
        {
            toolTip2.SetToolTip(lb, itemtext);
            indexOfTooltippedItem = indexUnderTheMouse;
        }
        else
        {
            toolTip2.SetToolTip(lb, "");
            indexOfTooltippedItem = -1;
        }
        
        g.Dispose();
    }
}

Items in ListBox: contextmenu op rechtsklik

De mooiste oplossing is, als je in de listbox een collectie van jouw objecten hebt geplaatst. Dan hoef je bij de rechtsklik alleen maar dat object te onthouden voor de afhandeling. Je kunt echter ook bepaalde waarden van het gekozen item in een of meer globals bewaren.

private MyObject contextItemMyObject;

private void lst_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
	    ListBox lb = (ListBox)sender;
	    int indexUnderTheMouse = lb.IndexFromPoint(e.X, e.Y);
	    if (indexUnderTheMouse == -1) return;
	
	    lb.SelectedIndex = indexUnderTheMouse;
	    MyObject mo = (MyObject)lb.SelectedItem;
	    contextItemMyObject = mo;
        myContextMenuStrip.Show(lb, new Point(e.X, e.Y));
    }
}
       
In de handler van je contextmenukeuze beschik je over het gekozen object in de global contextItemMyObject.


State keeping

State keeping over meerdere monitoren

In de volgende twee routines wordt gecontroleerd of een bepaalde bewaarde links- of top-positie van een venster in de actuele monitor configuratie nog wel geldig c.q. zichtbaar is. Zo niet, dan wordt false teruggegeven. Je kunt in zo'n geval overwegen om het betreffende venster niet te herstellen, maar op zijn default plek te laten verschijnen.

        private bool isValidLeft(int left)
        {
            bool validLocation = false;
            Screen[] screens = Screen.AllScreens;
            int upperBound = screens.GetUpperBound(0);
            int x, w;

            for (int index = 0; index <= upperBound; index++)
            {
                // For each screen, check if Location fals within bounds.
                x = screens[index].Bounds.X;
                w = screens[index].Bounds.Width;
                if (left > x && left < x + w - 10)
                    validLocation = true;
            }
            return validLocation;
        }

        private bool isValidTop(int top)
        {
            bool validLocation = false;
            Screen[] screens = Screen.AllScreens;
            int upperBound = screens.GetUpperBound(0);
            int y, h;

            for (int index = 0; index <= upperBound; index++)
            {
                // For each screen, check if Location fals within bounds.
                y = screens[index].Bounds.Y;
                h = screens[index].Bounds.Height;
                if (top > y && top < y + h - 10)
                    validLocation = true;
            }
            return validLocation;
        }