Di masa lalu, tabel tidak selalu digunakan untuk mengikat DataGridView secara langsung, dan tidak ada masalah karena tidak dapat mengurutkan. Ketika saya pertama kali mencoba Daftar, saya menemukan bahwa fungsi pengurutan tidak dapat diterapkan apa pun yang terjadi
Setiap kolom DataGridView memiliki Sortable. Defaultnya adalah Otomatis. Saya mengubahnya menjadi NotSortable.
Beberapa teman mengatakan bahwa Anda dapat menyeret kontrol bindingsource.datasource=generic collection datagridview.datasource=bindingsource;
Saya menemukan itu tidak berhasil juga, jadi apa yang harus saya lakukan? Cari tahu setelah memeriksa informasinya
Menggunakan obat generik akan kehilangan karakteristik DateTable. Anda harus mengimplementasikan System.Collections.Generic.IComparer<T> untuk mencapai penyortiran.
Tidak ada cara lain selain mewujudkannya
Perhatikan kode di bawah ini, pada dasarnya tampilannya seperti ini
kode
menggunakan Sistem;
menggunakan Sistem.ComponentModel;
menggunakan System.Collections.Generik;
menggunakan Sistem.Refleksi;
Fungsi Dasar namespace
{
kelas ObjectPropertyCompare<T> : Sistem.Koleksi.Generik.IComparer<T>
{
properti PropertyDescriptor pribadi;
arah ListSortDirection pribadi;
public ObjectPropertyCompare (properti PropertyDescriptor, arah ListSortDirection)
{
this.property = properti;
this.direction = arah;
}
#pembanding Iwilayah<T>
/// <ringkasan>
/// Metode perbandingan
/// </ringkasan>
/// <param name="x">Atribut relatif x</param>
/// <param name="y">Atribut relatif y</param>
/// <pengembalian></pengembalian>
public int Bandingkan(T x, T y)
{
objek xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
objek yValue = y.GetType().GetProperty(property.Name).GetValue(y, null);
int nilai pengembalian;
jika (xValue dapat dibandingkan)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
lain jika (xValue.Equals(yValue))
{
nilai kembalian = 0;
}
kalau tidak
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
if (arah == ListSortDirection.Ascending)
{
kembali returnValue;
}
kalau tidak
{
kembali returnValue * -1;
}
}
bool publik Sama dengan (T xWord, T yWord)
{
return xWord.Equals(yWord);
}
publik int GetHashCode(T obj)
{
kembalikan obj.GetHashCode();
}
#wilayah akhir
}
}
Setelah mengimplementasikan antarmuka ini, kita tidak perlu terburu-buru. Kita harus menulis kelas SortableBindingList <T> :BindingList <T> untuk mengikat data.
Implementasi dasar
kode
menggunakan Sistem;
menggunakan Sistem.ComponentModel;
menggunakan System.Collections.Generik;
menggunakan Sistem.IO;
menggunakan System.Runtime.Serialization.Formatters.Binary;
menggunakan Sistem.Teks;
Fungsi Dasar namespace
{
BindingCollection<T> kelas publik : BindingList<T>
{
bool pribadi Diurutkan;
properti sortir PropertyDescriptor pribadi;
sortDirection ListSortDirection pribadi;
penggantian yang dilindungi bool IsSortedCore
{
dapatkan { kembali Diurutkan; }
}
penggantian yang dilindungi bool SupportsSortingCore
{
dapatkan { kembalikan benar; }
}
dilindungi menimpa ListSortDirection SortDirectionCore
{
dapatkan { return sortDirection }
}
penggantian yang dilindungi PropertyDescriptor SortPropertyCore
{
dapatkan { return sortProperty }
}
penggantian yang dilindungi bool SupportsSearchingCore
{
dapatkan { kembalikan benar; }
}
penggantian yang dilindungi batal ApplySortCore (properti PropertyDescriptor, arah ListSortDirection)
{
Daftar<T> item = ini.Item sebagai Daftar<T>;
jika (item != nol)
{
ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(properti, arah);
item.Sort(pc);
diurutkan = benar;
}
kalau tidak
{
diurutkan = salah;
}
sortProperty = properti;
sortDirection = arah;
this.OnListChanged(ListChangedEventArgs baru(ListChangedType.Reset, -1));
}
penggantian yang dilindungi batal HapusSortCore()
{
diurutkan = salah;
this.OnListChanged(ListChangedEventArgs baru(ListChangedType.Reset, -1));
}
//Menyortir
Penyortiran kekosongan publik (properti PropertyDescriptor, arah ListSortDirection)
{
this.ApplySortCore(properti, arah);
}
}
}
Sekarang saatnya mencari tahu cara menggunakannya. Ini sebenarnya sangat sederhana.
langsung
BindingCollection<object> objList = BindingCollection<object>();
objList = kumpulan hasil Anda;
this.dataGridView1.DataSource = objList;
Tapi sekarang masalahnya saya menggunakan List sebelumnya dan saya tidak ingin mengubahnya, apalagi Dll dipanggil dan yang dikembalikan adalah List.
Setelah lama dipikir-pikir, akhirnya saya menemukan jawabannya, namun saya belum tahu bagaimana performa dan aspek lainnya, jadi saya akan memposting kodenya dan mari kita bahas.
Inilah cara saya mencapainya
kode
//Kelas yang dapat mengimplementasikan pengurutan
BindingCollection<historyorderInfo> objList = BindingCollection baru<historyorderInfo>();
//Muat data
foreach (item historiorderInfo di tmpList)
{
objList.Tambahkan(item);
}
dgvhistory.DataSource = objList;
TmpList di sini adalah Daftar asli dari sistem yang saya gunakan sebelumnya. Saya menggunakan foreach untuk mengimpor data asli ke BindingCollection.
Tekad ini dapat mencapai efek yang saya inginkan. Saya tidak tahu apa yang salah dengan ini. Semoga bisa mendapat saran dari ahlinya, haha