0

我试图了解这里发生了什么。我有一个 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);
    }
4

1 回答 1

1

我认为在 ItemCheck 事件中执行此操作没有什么意义。只需在保存时计算增量。减少了一堆代码和虚假事件的麻烦。

于 2011-01-30T07:19:54.867 回答