c# event fires windows form incorrectly

Posted by MikeW on Stack Overflow See other posts from Stack Overflow or by MikeW
Published on 2011-01-30T06:55:37Z Indexed on 2011/01/30 7:25 UTC
Read the original article Hit count: 249

Filed under:
|
|

I'm trying to understand what's happening here. I have a CheckedListBox which contains some ticked and some un-ticked items. I'm trying to find a way of determining the delta in the selection of controls. I've tried some cumbersome like this - but only works part of the time, I'm sure there's a more elegant solution. A maybe related problem is the myCheckBox_ItemCheck event fires on form load - before I have a chance to perform an ItemCheck. Here's what I have so far:

    void clbProgs_ItemCheck(object sender, ItemCheckEventArgs e)
    {
         // i know its awful

        System.Windows.Forms.CheckedListBox cb = (System.Windows.Forms.CheckedListBox)sender;

        string sCurrent = e.CurrentValue.ToString();
        int sIndex = e.Index;
        AbstractLink lk = (AbstractLink)cb.Items[sIndex];

        List<ILink> _links = clbProgs.DataSource as List<ILink>;

        foreach (AbstractLink lkCurrent in _links)
        {

            if (!lkCurrent.IsActive)
            {
                if (!_groupValues.ContainsKey(lkCurrent.Linkid))
                {
                    _groupValues.Add(lkCurrent.Linkid, lkCurrent);
                }
            }
        }

        if (_groupValues.ContainsKey(lk.Linkid))
        {
            AbstractLink lkDirty = (AbstractLink)lk.Clone();

            CheckState newValue = (CheckState)e.NewValue;
            if (newValue == CheckState.Checked)
            {
                lkDirty.IsActive = true;

            }
            else if (newValue == CheckState.Unchecked)
            {
                lkDirty.IsActive = false;
            }

            if (_dirtyGroups.ContainsKey(lk.Linkid))
            {
                _dirtyGroups[lk.Linkid] = lkDirty;
            }
            else
            {
                CheckState oldValue = (CheckState)e.NewValue;
                if (oldValue == CheckState.Checked)
                {
                    lkDirty.IsActive = true;

                }
                else if (oldValue == CheckState.Unchecked)
                {
                    lkDirty.IsActive = false;
                }

                _dirtyGroups.Add(lk.Linkid, lk);
            }

        }
        else
        {
            if (!lk.IsActive)
            {
                _dirtyGroups.Add(lk.Linkid, lk);
            }
            else
            {
                _groupValues.Add(lk.Linkid, lk);
            }
        }
    }

Then onclick of a save button - I check whats changed before sending to database:

    private void btSave_Click(object sender, EventArgs e)
    {

        List<AbstractLink> originalList = new List<AbstractLink>(_groupValues.Values);
        List<AbstractLink> changedList = new List<AbstractLink>(_dirtyGroups.Values);

        IEnumerable<AbstractLink> dupes = originalList.ToArray<AbstractLink>().Intersect(changedList.ToArray<AbstractLink>());

        foreach (ILink t in dupes)
        {
            MessageBox.Show("Changed");
        }
        if (dupes.Count() == 0)
        {
            MessageBox.Show("No Change");
        }
    }

For further info. The definition of type AbstractLink uses:

    public bool Equals(ILink other)
    {
        if (Object.ReferenceEquals(other, null)) return false;
        if (Object.ReferenceEquals(this, other)) return true;
        return IsActive.Equals(other.IsActive) && Linkid.Equals(other.Linkid);
    }

© Stack Overflow or respective owner

Related posts about c#

Related posts about state