如何创建可比较的图像

时间:2011-10-09 10:59:19

标签: c# datagridview bindinglist

我有DataGridView已绑定到通用BindingList。我希望能够在DataGridViewImageColumn类型的列上应用排序搜索基本思想是将名称存储到图像Tag中,并用于排序和搜索。我该怎么做?

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

  1. 创建一个继承System.Drawing.Image并使其具有可比性的新类。
    • Image是一个抽象类,如果我从它继承(以及IComparable接口),我将遇到此错误消息:类型'System.Drawing.Image'没有构造函数定义。 这里有什么问题?图片是abstract而不是sealed类,但它不允许我继承它!
  2. 使用来自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! */
              }
          }
      }
      
  3. 创建从DataGridViewColumn继承的新DataGridViewImageColumn
    • 这似乎并不容易,如果其他想法无法使用,可能会被使用。
  4. 提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

希望这有帮助。

答案 1 :(得分:1)

我找到了路!


<强> 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>(...);
    }
}