如何创建一个可比的图像
本文关键字:图像 一个 何创建 创建 | 更新日期: 2023-09-27 18:10:42
我有一个已绑定到通用BindingList
的DataGridView
。我希望能够应用排序和搜索对DataGridViewImageColumn
类型的列。基本思想是将名称存储到图像Tag
中,并使用它进行排序和搜索。我该怎么做呢?
似乎有几种方法可以做到:
- 创建继承
System.Drawing.Image
的新类并使其具有可比性。-
Image
是一个抽象类,如果我从它继承(以及IComparable
接口),我会遇到这个错误消息:类型'System.Drawing。Image'没有定义构造函数。这里有什么问题?图像是一个abstract
不是sealed
类,但它不允许我继承它!
-
-
使用protected override
ApplySortCore
方法从BindingList<T>
继承类-
方法如下:
class MyBindingList<T> : BindingList<T> { ... protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { if (prop.PropertyType.Equals(typeof(Image))) { /* I have no idea! */ } } }
-
- 创建新的
DataGridViewColumn
继承DataGridViewImageColumn
。- 这似乎不容易,如果其他的想法是不可用的,可以使用。
Thanks in advance
创建一个类(X)封装System.Drawing。Image + ImageAlias字符串属性。将您的图像列绑定到X.Image并在X.ImageAlias上搜索。
很抱歉,我手头没有编码工具来提供一个例子,但这是一个基本的想法。
我找到路了!
MyBindingList
class MyBindingList<T> : BindingList<T>
{
...
protected override void ApplySortCore(PropertyDescriptor prop,
ListSortDirection direction)
{
if (prop.PropertyType.Equals(typeof(Image)))
{
_SortPropertyCore = prop;
_SortDirectionCore = direction;
var items = this.Items;
Func<T, object> func =
new Func<T, object>(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<T>);
ResetBindings();
}
else
{
...
}
}
private void ResetItems(List<T> 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<MyDataObject>(...);
}
}