c#事件不正确地触发窗体

我想知道这里发生了什么。我有一个CheckedListBox,其中包含一些已勾选和一些未勾选的项目。我试图找到一种方法来确定控件选择中的增量。我尝试过这样的繁琐 - 但只是部分时间有效,我相信这是一个更优雅的解决方案。一个可能相关的问题是myCheckBox_ItemCheck事件在表单加载时触发 - 在我有机会执行ItemCheck之前。这是我到目前为止所拥有的:
    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);
            }
        }
    }
然后点击一个保存按钮 - 我在发送到数据库之前检查了什么更改:
    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");
        }
    }
有关详细信息。 AbstractLink类型的定义使用:
    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);
    }
    
已邀请:
我在ItemCheck事件中看到了这一点。只需在保存时计算增量。删除一堆代码和麻烦事件的麻烦。     

要回复问题请先登录注册