以前は、DataGridView を直接バインドするためにテーブルが使用されるとは限らず、並べ替えができないという問題はありませんでした。最初に List を試してみたところ、友人はどうやっても並べ替え機能を実装できませんでした。
DataGridView の各列には Sortable があり、デフォルトでは NotSortable に変更しましたが、結果が何であっても機能しません。
何人かの友人は、bindingsource コントロールをドラッグできると言いました。
それも機能しないことがわかりました。どうすればよいですか?情報を確認してから知る
ジェネリックスを使用すると、DateTable の特性が失われます。並べ替えを行うには、System.Collections.Generic.IComparer<T> を実装する必要があります。
それを悟るしか方法はない
以下のコードを見てください。基本的には次のようになります
コード
システムを使用する;
System.ComponentModel を使用します。
System.Collections.Generic を使用します。
System.Reflection を使用します。
名前空間BaseFunction
{
クラス ObjectPropertyCompare<T> : System.Collections.Generic.IComparer<T>
{
プライベート PropertyDescriptor プロパティ。
プライベート ListSortDirection 方向。
public ObjectPropertyCompare(PropertyDescriptor プロパティ、ListSortDirection 方向)
{
this.property = プロパティ;
this.direction = 方向;
}
#region IComparer<T>
/// <概要>
/// 比較方法
/// </概要>
/// <param name="x">相対属性 x</param>
/// <param name="y">相対属性 y</param>
/// <戻り値></戻り値>
public int Compare(T x, T y)
{
オブジェクト xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
オブジェクト yValue = y.GetType().GetProperty(property.Name).GetValue(y, null);
int 戻り値;
if (xValue が IComparable)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
else if (xValue.Equals(yValue))
{
戻り値 = 0;
}
それ以外
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
if (方向 == ListSortDirection.Ascending)
{
戻り値を返します。
}
それ以外
{
戻り値 * -1;
}
}
public bool Equals(T xWord, T yWord)
{
xWord.Equals(yWord) を返します。
}
public int GetHashCode(T obj)
{
obj.GetHashCode() を返します。
}
#エンドリージョン
}
}
このインターフェイスを実装した後、データをバインドするために SortableBindingList <T> :BindingList <T> クラスを作成する必要はありません。
基本的な実装
コード
システムを使用する;
System.ComponentModel を使用します。
System.Collections.Generic を使用します。
System.IO を使用します。
System.Runtime.Serialization.Formatters.Binary を使用します。
System.Text を使用します。
名前空間BaseFunction
{
パブリック クラス BindingCollection<T> : BindingList<T>
{
private bool はソートされています。
プライベート PropertyDescriptor sortProperty;
プライベートListSortDirectionソート方向;
protected オーバーライド bool ISSortedCore
{
get { 戻り値 }
}
protected オーバーライド bool SupportsSortingCore
{
取得 { true を返します }
}
protected オーバーライド ListSortDirection SortDirectionCore
{
get { 戻り値 }
}
protected オーバーライド PropertyDescriptor SortPropertyCore
{
get { 戻りソートプロパティ }
}
protected オーバーライド bool SupportsSearchingCore
{
取得 { true を返します }
}
protected オーバーライド void applySortCore(PropertyDescriptor プロパティ、ListSortDirection 方向)
{
List<T> items = this.Items as List<T>;
if (項目 != null)
{
ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(プロパティ, 方向);
items.Sort(pc);
isSorted = true;
}
それ以外
{
isSorted = false;
}
sortProperty = プロパティ;
sortDirection = 方向;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
保護されたオーバーライド void RemoveSortCore()
{
isSorted = false;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
//選別
public void Sort(PropertyDescriptor プロパティ、ListSortDirection 方向)
{
this.ApplySortCore(プロパティ、方向);
}
}
}
今度はその使い方を見てみましょう。実際はとても簡単です。
直接
BindingCollection<object> objList = new BindingCollection<object>();
objList = 結果セット;
this.dataGridView1.DataSource = objList;
しかし、今の問題は、以前にListを使用していて、それを変更したくないことです。さらに、Dllが呼び出され、返されるのはBindingCollection<object>に変更する方法がありません。
ずっと考えてやっと思いつきましたが、性能などはどうなのか分からないのでコードを載せて議論してみます。
これが私がそれを達成した方法です
コード
//ソートを実装できるクラス
BindingCollection<historyorderInfo> objList = new BindingCollection<historyorderInfo>();
//データをロードする
foreach (tmpList のhistoryorderInfo 項目)
{
objList.Add(項目);
}
dgvhistory.DataSource = objList;
ここでの tmpList は、以前に foreach を使用して元のデータを BindingCollection にインポートしたシステムの元のリストです。
この決意があれば、私が望む効果が得られます。これの何が問題なのか分かりません。専門家からアドバイスをいただければ幸いです(笑)