예전에는 DataGridView를 직접 바인딩하기 위해 항상 테이블을 사용하지 않았고, 정렬이 안되는 문제도 없었는데, 처음 List를 시도했을 때 친구가 아무리 말해도 정렬 기능을 구현할 수 없다는 것을 알았습니다.
DataGridView의 각 열에는 Sortable이 있습니다. 기본값은 자동입니다. 결과가 어떻든 여전히 작동하지 않습니다.
몇몇 친구들은 바인딩소스 컨트롤을 드래그할 수 있다고 말했습니다.
그것도 작동하지 않는 것으로 나타났습니다. 어떻게 해야 합니까? 정보 확인 후 알아보세요
제네릭을 사용하면 DateTable의 특성이 손실됩니다. 정렬을 수행하려면 System.Collections.Generic.IComparer<T>를 구현해야 합니다.
그것을 깨닫는 것 외에는 다른 방법이 없다
아래 코드를 살펴보면 기본적으로 다음과 같습니다.
암호
시스템 사용;
System.ComponentModel 사용;
System.Collections.Generic을 사용합니다.
System.Reflection 사용;
네임스페이스 BaseFunction
{
클래스 ObjectPropertyCompare<T> : System.Collections.Generic.IComparer<T>
{
개인 PropertyDescriptor 속성;
개인 ListSortDirection 방향;
공용 ObjectPropertyCompare(PropertyDescriptor 속성, ListSortDirection 방향)
{
this.property = 속성;
this.direction = 방향;
}
#region IComparer<T>
/// <요약>
/// 비교 방법
/// </summary>
/// <param name="x">상대 속성 x</param>
/// <param name="y">상대 속성 y</param>
/// <반환></반환>
공개 int 비교(T x, T y)
{
개체 xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
개체 yValue = y.GetType().GetProperty(property.Name).GetValue(y, null);
int returnValue;
if(xValue가 IComparable임)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
그렇지 않으면 (xValue.Equals(yValue))
{
반환 값 = 0;
}
또 다른
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
if (방향 == ListSortDirection.Ascending)
{
반환 값;
}
또 다른
{
returnvalue * -1;
}
}
public bool Equals(T xWord, T yWord)
{
xWord.Equals(yWord)를 반환합니다.
}
공개 int GetHashCode(T obj)
{
return obj.GetHashCode();
}
#endregion
}
}
이 인터페이스를 구현한 후에는 데이터를 바인딩하기 위해 SortableBindingList <T> :BindingList <T> 클래스를 작성해야 합니다.
기본 구현
암호
시스템 사용;
System.ComponentModel 사용;
System.Collections.Generic을 사용합니다.
System.IO 사용;
System.Runtime.Serialization.Formatters.Binary를 사용합니다.
System.Text 사용;
네임스페이스 BaseFunction
{
공개 클래스 BindingCollection<T> : BindingList<T>
{
개인 bool isSorted;
개인 PropertyDescriptor sortProperty;
개인 ListSortDirection sortDirection;
보호된 재정의 bool IsSortedCore
{
get { 반환 isSorted }
}
protected override bool SupportsSortingCore
{
{참을 반환}을 얻습니다;
}
보호된 재정의 ListSortDirection SortDirectionCore
{
get { return sortDirection };
}
보호된 재정의 PropertyDescriptor SortPropertyCore
{
get { return sortProperty };
}
보호된 재정의 bool SupportsSearchingCore
{
{참을 반환}을 얻습니다;
}
protected 재정의 void ApplySortCore(PropertyDescriptor 속성, ListSortDirection 방향)
{
List<T> 항목 = this.Items를 List<T>로;
if (항목 != null)
{
ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(속성, 방향);
항목.정렬(pc);
isSorted = 사실;
}
또 다른
{
정렬됨 = 거짓;
}
sortProperty = 속성;
sortDirection = 방향;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
보호된 재정의 void RemoveSortCore()
{
정렬됨 = 거짓;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
//종류
public void Sort(PropertyDescriptor 속성, ListSortDirection 방향)
{
this.ApplySortCore(속성, 방향);
}
}
}
이제 사용법을 알아볼 차례입니다. 실제로는 매우 간단합니다.
직접
BindingCollection<객체> objList = new BindingCollection<객체>();
objList =결과 세트;
this.dataGridView1.DataSource = objList;
하지만 이제 문제는 이전에 List를 사용했는데 이를 변경하고 싶지 않다는 것입니다. 게다가 Dll이 호출되고 반환되는 것은 List입니다. 이를 BindingCollection<object>로 변경할 방법이 없습니다.
오랫동안 고민한 끝에 겨우 알아냈는데, 성능이나 다른 측면에서는 어떤지 잘 모르겠어서 코드를 올려놓고 논의해보겠습니다.
이것이 내가 달성한 방법이다
암호
//정렬을 구현할 수 있는 클래스
BindingCollection<historyorderInfo> objList = new BindingCollection<historyorderInfo>();
//데이터 로드
foreach(tmpList의historyorderInfo 항목)
{
objList.Add(항목);
}
dgvhistory.DataSource = objList;
여기의 tmpList는 이전에 원본 데이터를 BindingCollection으로 가져오기 위해 foreach를 사용한 시스템의 원본 목록입니다.
이 결심이 내가 원하는 효과를 얻을 수 있다. 이게 무슨 문제인지 모르겠습니다. 전문가에게 조언을 구할 수 있었으면 좋겠습니다, 하하