如何创建可比较的图像
我有一个已绑定到genericsBindingList
的DataGridView
。 我希望能够对DataGridViewImageColumn
类型的列应用排序和搜索 。 基本思想是将名称存储到图像Tag
,用于排序和搜索。 我怎样才能做到这一点?
似乎有几种方法可以做到:
- 创建一个inheritance
System.Drawing.Image
并使其具有可比性的新类。-
Image
是一个抽象类,如果我inheritance它(以及IComparable
接口),我会遇到这个错误消息:类型’System.Drawing.Image’没有定义构造函数。 这有什么问题? 图像是一个abstract
而不是sealed
类,但它不允许我inheritance它!
-
-
使用
BindingList
的inheritance类的受保护覆盖ApplySortCore
方法。-
这种方法是这样的:
class MyBindingList : BindingList { ... protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { if (prop.PropertyType.Equals(typeof(Image))) { /* I have no idea! */ } } }
-
- 创建从
DataGridViewImageColumn
inheritance的新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(...); } }