수정/삭제/업데이트를 동시에 하기 위해 만든 클래스입니다.

한번에 수정/삭제/업데이트를

bool IsNew { set; get; }
bool IsDeleted { get; set; }
bool IsEdited { get; set; }

가지고 확인 가능합니다.

 

환경설정

데이터 클래스는 아래의 두개 인터페이스를 구현해야 가능

INotifyPropertyChanged(using System.ComponentModel). , IDataContextState (걍 제가만든..)

 

가 구현되어져 있어야 프로퍼티가 수정되었을때 IsEdit 변경가능

아래인터페이스는 수정/추가/삭제 상태변경을 확인하기 위해 만든 인터페이스 입니다.

    /// <summary>
    /// 데이터베이스의 상태관리를 합니다.
    /// </summary>
    public interface IDataContextState
    {
        bool IsNew { set; get; }
        bool IsDeleted { get; set; }
        bool IsEdited { get; set; }
    }
DataGridView에서 프로퍼티가 수정되면 INotifyPropertyChanged 이벤트가 발생합니다.
IsEdit를 변경시키고 있습니다.
 

INotifyPropertyChanged 구현

        protected virtual void SendPropertyChanged(String propertyName)
        {
            if ((this.PropertyChanged != null))
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                this.IsEdited = true; //상태변경
            }
        }

IDataContextState 구현

 #region IDataContextState Members
        private bool _IsNew = false;
        private bool _IsDeleted = false;
        private bool _IsEdited = false;

        public bool IsNew
        {
            set
            {
                this._IsNew = value;
            }
            get
            {
				//고유증감 번호라든지 생성날짜가 없으면 신규로 본다
                return this._CreateTimesamp == null && !this.IsDeleted;
            }
        }
        
        public bool IsDeleted            
        {
            set
            {
                this._IsDeleted = value;
            }
            get
            {
                return this._IsDeleted;
            }
        }

        public bool IsEdited
        {
            set
            {
                this._IsEdited = value;
            }
            get
            {
                return this._IsEdited;
            }
        }

        #endregion

RepositoryManager.cs 구현

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace PersonnelManagement.Data
{
    /// <summary>
    /// TODO  RepositoryManager 데이터를 관리하는 클래스
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class RepositoryManager<T> : BindingList<T>
    {
        BindingList<T> DeleteBindingList = new BindingList<T>();
        
        /// <summary>
        /// 신규추가
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void IsNew(T t)
        {
            if (t != null)
            {
                Type type = t.GetType().GetInterface("IDataContextState");
                if (type != null)
                {
                    ((Contract.Data.IDataContextState)t).IsNew = true;
                    this.Add(t);
                }
            }
        }

        /// <summary>
        /// (사용안함 ) INotifyPropertyChanged 로 자동 수정 상태변경
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void IsUpdate(T t)
        {
            if (t != null)
            {
                Type type = t.GetType().GetInterface("IDataContextState");
                if (type != null)
                {
                    ((Contract.Data.IDataContextState)t).IsEdited = true;
                }
            }
        }
        

        /// <summary>
        /// 실제로 삭제하지 않고 상태만 변경
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void IsDelete(T t)
        {
            if (t != null)
            {
                Type type = t.GetType().GetInterface("IDataContextState");
                if (type != null)
                {
                    ((Contract.Data.IDataContextState)t).IsDeleted = true;
                    foreach (var item in this.ToList() )
	                {
                        bool result =      Object.Equals(item , t );
                        if (result) {
                            ((Contract.Data.IDataContextState)item).IsDeleted = true;
                            DeleteBindingList.Add(t); //삭제된건 DeleteBindingList 담아둔다. 
                            this.Remove(t);
                            break;
                        }
	                } //end for
                }
            }
        }
        

        public void AddRange(List<T> list)
        {
            foreach (var item in list)
            {
                this.Add(item);
            }
        }

        /// <summary>
        /// 삭제 아이템을 포함 전체 리스트 반환
        /// </summary>
        /// <returns></returns>
        public List<T> GetBindingList() 
        {
            //삭제된 내용 담기
            foreach (var item in this.DeleteBindingList)
            {
                this.Add(item);
            }
            return this.ToList();
        }
    }
}

 

 

사용방법

바인딩

			//리스트 형식의 데이터를 받아옴
           List<Contract.Data.Doc.DocCategory> list = docManager.GetDocCategory(string.Empty);
			//담기
           DocCategoryRepositoryManager.AddRange(list);
			//그리드 뷰의 바인딩하기
           docCategoryBindingSource.DataSource = DocCategoryRepositoryManager;

 

가져오기

 List<DocCategory> resultList = this.DocCategoryRepositoryManager.GetBindingList();

이걸 사용하기 위해서는 아래의 인터페이스가 구현되어져 있어야함

추가

            //추가
            Contract.Data.Doc.DocCategory dc = new Contract.Data.Doc.DocCategory();
            DocCategoryRepositoryManager.IsNew(dc);

삭제

            foreach (DataGridViewRow row in this.dgvDocCategory.SelectedRows)
            {
                DocCategory dc = row.DataBoundItem as Contract.Data.Doc.DocCategory;
                if (dc != null)
                {
                    DocCategoryRepositoryManager.IsDelete(dc);
                }
            }

+ Recent posts