첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

▶ BindingList<T> 클래스 : 속성 값 검색 기능 추가하기

using System.ComponentModel;
using System.Reflection;

/// <summary>
/// 커스텀 바인딩 리스트
/// </summary>
/// <typeparam name="T">타입</typeparam>
public class CustomBindingList<T> : BindingList<T>
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Protected

    #region 코어 검색 지원 여부 - SupportsSearchingCore

    /// <summary>
    /// 코어 검색 지원 여부
    /// </summary>
    protected override bool SupportsSearchingCore
    {
        get
        {
            return true;
        }
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 찾기 - Find(propertyName, key)

    /// <summary>
    /// 찾기
    /// </summary>
    /// <param name="propertyName">속성명</param>
    /// <param name="key">키</param>
    /// <returns>처리 결과</returns>
    public int Find(string propertyName, object key)
    {
        PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(typeof(T));

        PropertyDescriptor propertyDescriptor = propertyDescriptorCollection.Find(propertyName, true);

        if(propertyDescriptor == null)
        {
            return -1;
        }
        else
        {
            return FindCore(propertyDescriptor, key);
        }
    }

    #endregion

    ////////////////////////////////////////////////////////////////////////////////////////// Protected

    #region 코어 찾기 - FindCore(propertyDescriptor, key)

    /// <summary>
    /// 코어 찾기
    /// </summary>
    /// <param name="propertyDescriptor">속성 설명자</param>
    /// <param name="key">키</param>
    /// <returns>처리 결과</returns>
    protected override int FindCore(PropertyDescriptor propertyDescriptor, object key)
    {
        PropertyInfo propertyInfo = typeof(T).GetProperty(propertyDescriptor.Name);

        T item;

        if(key != null)
        {
            for(int i = 0; i < Count; ++i)
            {
                item = (T)Items[i];

                if(propertyInfo.GetValue(item, null).Equals(key))
                {
                    return i;
                }
            }
        }

        return -1;
    }

    #endregion
}

 

▶ BindingList<T> 클래스 : 속성 값 검색 기능 추가하기 예제

/// <summary>
/// 학생
/// </summary>
public class Student
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 학번 - ID

    /// <summary>
    /// 학번
    /// </summary>
    public int ID { get; set; }

    #endregion

    #region 성명 - Name

    /// <summary>
    /// 성명
    /// </summary>
    public string Name { get; set; }

    #endregion

    #region 학년 - Grade

    /// <summary>
    /// 학년
    /// </summary>
    public int Grade { get; set; }

    #endregion
}

CustomBindingList<Student> customBindingList = new CustomBindingList<Student>();

customBindingList.Add(new Student() { ID = 1, Name = "홍길동", Grade = 3 });
customBindingList.Add(new Student() { ID = 2, Name = "홍길숙", Grade = 3 });
customBindingList.Add(new Student() { ID = 3, Name = "홍길도", Grade = 2 });
customBindingList.Add(new Student() { ID = 4, Name = "홍길자", Grade = 1 });
customBindingList.Add(new Student() { ID = 5, Name = "홍길수", Grade = 1 });

this.dataGridView.DataSource = customBindingList;

int index = customBindingList.Find("Name", "홍길수");
728x90
반응형
그리드형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요