如何创建可比较的图像

我有一个已绑定到genericsBindingListDataGridView 。 我希望能够对DataGridViewImageColumn类型的列应用排序搜索基本思想是将名称存储到图像Tag ,用于排序和搜索。 我怎样才能做到这一点?

似乎有几种方法可以做到:

  1. 创建一个inheritanceSystem.Drawing.Image并使其具有可比性的新类。
    • Image是一个抽象类,如果我inheritance它(以及IComparable接口),我会遇到这个错误消息:类型’System.Drawing.Image’没有定义构造函数。 这有什么问题? 图像是一个abstract而不是sealed类,但它不允许我inheritance它!
  2. 使用BindingList的inheritance类的受保护覆盖ApplySortCore方法。

    • 这种方法是这样的:

       class MyBindingList : BindingList { ... protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { if (prop.PropertyType.Equals(typeof(Image))) { /* I have no idea! */ } } } 
  3. 创建从DataGridViewImageColumninheritance的新DataGridViewImageColumn
    • 这似乎并不容易,如果其他想法无法使用,可能会被使用。

提前致谢

创建一个包含System.Drawing的类(X)。 Image + ImageAlias字符串属性。 将您的图像列绑定到X.Image并搜索X.ImageAlias。

抱歉,我手上没有编码工具提供示例,但这是一个基本想法。

希望这可以帮助。

我找到了方法!


MyBindingList

 class MyBindingList : BindingList { ... protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { if (prop.PropertyType.Equals(typeof(Image))) { _SortPropertyCore = prop; _SortDirectionCore = direction; var items = this.Items; Func func = new Func(t => (prop.GetValue(t) as Image).Tag); switch (direction) { case ListSortDirection.Ascending: items = items.OrderBy(func).ToList(); break; case ListSortDirection.Descending: items = items.OrderByDescending(func).ToList(); break; } ResetItems(items as List); ResetBindings(); } else { ... } } private void ResetItems(List items) { base.ClearItems(); for (int itemIndex = 0; itemIndex < items.Count; itemIndex++) { base.InsertItem(itemIndex, items[itemIndex]); } } } 

MyDataObject

 class MyDataObject : INotifyPropertyChanged { ... public Image MyProp { get { return CreateComparableImage(myImage, "myImage"); } } private Image CreateComparableImage(Image image, string alias) { Image taggedImage = new Bitmap(image); taggedImage.Tag = alias; return taggedImage; } } 

形成

 class MyForm : Form { ... void BindDGV() { dataGridView1.Columns["myColumnName"].DataPropertyName = "MyProp"; dataGridView1.DataSource = MyBindingList(...); } } 
Interesting Posts