Generic.List: Как установить / получить позицию / currentitem для DataGridView? - PullRequest
1 голос
/ 30 августа 2011

В настоящее время я работаю над расширением DataGridView с пользовательской обработкой DataSource. Если я связываю список с двумя обычными System.Windows.Forms.DataGridView и выбираю элемент в dataGridView1, dataGridView2 автоматически также устанавливает позицию для элемента.

Если я назначаю BindingSource, я могу обработать событие PositionChanged, но Generic.List не имеет CurrencyManager, так как dataGridView2 узнает новую позицию?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Наконец я нашел ответ: BindingContext!

Простой пример:

public class ModifiedCollection : BindingSource {
    BindingSource Source {get;set;}
    BindingManagerBase bmb;
    Control Parent;

    public ModifiedCollection(object Source, Control Parent) {
        if ((this.Source = Source as BindingSource) == null) {
            this.Source = new BindingSource();
            this.Source.DataSource = Source;
        }

        this.Source.ListChanged += new ListChangedEventHandler(Source_ListChanged);


        this.Parent = Parent;
        this.Parent.BindingContextChanged += new EventHandler(Parent_BindingContextChanged);
    }

    void Parent_BindingContextChanged(object sender, EventArgs e) {
        if (bmb != null) {
            bmb.PositionChanged -= bmb_PositionChanged;
        }
        if (Parent.FindForm().BindingContext.Contains(this.Source.DataSource)) {
            bmb = Parent.BindingContext[this.Source.DataSource];
            if (bmb != null) {
                bmb.PositionChanged += new EventHandler(bmb_PositionChanged);
            }
        }
    }
}
1 голос
/ 30 августа 2011

Вы хотите получить текущую позицию некоторого DataGridView (имеющего список как DataSource) из списка? Тогда ответ: вы не можете. Список ничего не знает о подключенном виде - показанный элемент включен (конечно)

Альтернатива для получения информации из DataGridView: подпишитесь на событие SelectionChanged объекта DataGridView и соответственно установите индекс второго - для обоих вариантов вы сможете использовать свойство CurrentCell -property

Вы не можете делать такие вещи, как описано в ваших комментариях ниже, не зная кое-что о DataGridView. Это другой дизайн - вы можете реализовать свой собственный «ShowableList» или что-то еще и попробовать создать свой собственный DataGridView, который показывает указанный элемент из вашего ShowableList и устанавливает там ShownIndex - но вы должны сделать это самостоятельно.

...