2

私はDataGridViewジェネリックにバインドされた を持っていBindingListます。type の列に並べ替え検索を適用できるようにしたい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 に答える 2

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>(...);
    }
}
于 2011-10-10T08:36:25.580 に答える
1

System.Drawing をカプセル化するクラス (X) を作成します。画像 + ImageAlias 文字列プロパティ。画像列を X.Image にバインドし、X.ImageAlias を検索します。

申し訳ありませんが、例を提供するためのコーディング ツールを手元に持っていませんが、これは基本的な考え方です。

お役に立てれば。

于 2011-10-09T12:24:24.150 に答える