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 に答える