8

この記事で説明されているようにDataGridView、に裏打ちされたを持っています。SortableBindingList

これは基本的に、BindingListそのデータソースがカスタムオブジェクトのリストであるものです。基になるカスタムオブジェクトはプログラムで更新されます。

MySortableBindingListを使用すると、各列を昇順または降順で並べ替えることができます。私はApplySortCoreメソッド をオーバーロードすることによってこれを行いました

protected override void ApplySortCore(PropertyDescriptor prop,
                                      ListSortDirection direction)

これは、列ヘッダーがクリックされたときの並べ替えには適していますが、その列のセルがプログラムで更新されたときに自動的に並べ替えられることはありません。

DataGridView基盤となるデータソースのプログラムによる更新からソートされた状態を維持するための優れたソリューションを他の誰かが思いついたことがありますか?

4

2 に答える 2

4

OnDataSourceChanged イベントをオーバーライドしてみてください

public class MyGrid : DataGridView {
    protected override void OnDataSourceChanged(EventArgs e)
    {
        base.OnDataSourceChanged(e);
        MyComparer YourComparer = null;
        this.Sort(YourComparer);
    }
}
于 2013-05-29T05:51:27.963 に答える
1

このクラスを考えてみましょう:

public class MyClass : INotifyPropertyChanged
{
    private int _id;
    private string _value;

    public int Id
    {
        get
        {
            return _id;
        }
        set
        {
            PropertyChanged(this, new PropertyChangedEventArgs("Id"));
            _id = value;
        }
    }
    public string Value
    {
        get
        {
            return _value;
        }
        set
        {
            PropertyChanged(this, new PropertyChangedEventArgs("Value"));
            _value = value;
        }
    }
    public event PropertyChangedEventHandler PropertyChanged = new PropertyChangedEventHandler(OnPropertyChanged);

    private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // optional code logic
    }
}

これらのメソッドを並べ替え可能なバインディング リストに追加します。

public class SortableBindingList<T> : BindingList<T>, INotifyPropertyChanged
    where T : class
{
    public void Add(INotifyPropertyChanged item)
    {
        item.PropertyChanged += item_PropertyChanged;
        base.Add((T)item);
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        this.PropertyChanged(sender, new PropertyChangedEventArgs(String.Format("{0}:{1}", sender, e)));
    }

    // other content in the method body
}

そして、このサンプル メソッドをフォームで使用します。

public Form1()
{
    InitializeComponent();
    source = new SortableBindingList<MyClass>();
    source.Add(new MyClass() { Id = 1, Value = "one test" });
    source.Add(new MyClass() { Id = 2, Value = "second test" });
    source.Add(new MyClass() { Id = 3, Value = "another test" });
    source.PropertyChanged += source_PropertyChanged;
    dataGridView1.DataSource = source;

}

void source_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    MessageBox.Show(e.PropertyName);
    dataGridView1.DataSource = source;
}

private void button1_Click(object sender, EventArgs e)
{
    ((MyClass)source[0]).Id++;
}
于 2013-06-04T13:11:47.660 に答える