Search code examples
c#winformscheckedlistbox

CheckedListBox Control - Only checking the checkbox when the actual checkbox is clicked


I'm using a CheckedListBox control in a small application I'm working on. It's a nice control, but one thing bothers me; I can't set a property so that it only checks the item when I actually check the checkbox. What's the best way to overcome this? I've been thinking about getting the position of the mouseclick, relative from the left side of the checkbox. Which works partly, but if I would click on an empty space, close enough to the left the current selected item would still be checked. Any ideas regarding this?


Solution

  • Well, it is quite ugly, but you could calculate mouse hit coordinates against rectangles of items by hooking on CheckedListBox.MouseDown and CheckedListBox.ItemCheck like the following

    /// <summary>
    /// In order to control itemcheck changes (blinds double clicking, among other things)
    /// </summary>
    bool AuthorizeCheck { get; set; }
    
    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if(!AuthorizeCheck)
            e.NewValue = e.CurrentValue; //check state change was not through authorized actions
    }
    
    private void checkedListBox1_MouseDown(object sender, MouseEventArgs e)
    {
        Point loc = this.checkedListBox1.PointToClient(Cursor.Position);
        for (int i = 0; i < this.checkedListBox1.Items.Count; i++)
        {
            Rectangle rec = this.checkedListBox1.GetItemRectangle(i);
            rec.Width = 16; //checkbox itself has a default width of about 16 pixels
    
            if (rec.Contains(loc))
            {
                AuthorizeCheck = true;
                bool newValue = !this.checkedListBox1.GetItemChecked(i);
                this.checkedListBox1.SetItemChecked(i, newValue);//check 
                AuthorizeCheck = false;
    
                return;
            }
        }
    }