Обновление DevExpress.XtraGrid после добавления элементов в список, который был ему присвоен - PullRequest
2 голосов
/ 29 марта 2012

У меня есть List<SomeClass> привязка к DevExpressXtraGrid, например:

MyXtraGrid.DataSource = MyList;

У меня есть несколько столбцов, созданных в конструкторе XtraGrid.Все в порядке, и строки были показаны в сетке, но когда я добавляю объекты в MyList, сетка не обновляется, а новый элемент не показывается.

Я пробовал с MyXtraGrid.Refresh(), пытался повторно связать с MyXtraGrid.DataSource = MyList, но это не сработало.

MyXtraGrix.MyView.PopulareColumns() - не вариант, потому что я не хочу, чтобы все поля из MyList отображались в сетке, и это приведет к появлению столбцов, которые я настроил с помощью конструктора.

Как обновить вид сетки, чтобы показать объект, который я добавил?

Ответы [ 2 ]

9 голосов
/ 30 марта 2012

Просто сделайте это:

    private void BindCollection(IEnumerable collection)
    {
        // keep current index
        GridView view = MyXtraGrid.Views[0] as GridView;
        int index = 0;
        int topVisibleIndex = 0;
        if (view != null)
        {
            index = view.FocusedRowHandle;
            topVisibleIndex = view.TopRowIndex;
        }

        MyXtraGrid.BeginUpdate();
        MyXtraGrid.DataSource = collection;
        MyXtraGrid.RefreshDataSource();

        if (view != null)
        {
            view.FocusedRowHandle = index;
            view.TopRowIndex = topVisibleIndex;
        }

        MyXtraGrid.EndUpdate();
    }

Вы также можете получить выбранную строку и повторно выбрать ее после установки нового источника данных.

Также обратите внимание, что вместо List вы можете использовать BindingList<>, чтобы сетка обновлялась сама, без необходимости написания одной строки кода. Подробнее здесь .

1 голос
/ 30 марта 2012

Используйте метод GridControl.RefreshDataSource , поскольку я использую данные своей коллекции. Источник - это список некоторого класса, и он содержит список другого класса для создания деталей основного вида.

GridControl scheduleGrid = sender as GridControl;
MyXtraGrid.DataSource = collection;
scheduleGrid.RefreshDataSource();

Если вы вносите изменения в IList (вне сетки), я считаю, что вам придется вызывать метод RefreshDatasource, а IList не делает уведомлений об изменениях. Метод RefreshDataSource

Я считаю, что вы должны наследовать от IBindingList , если вы хотите, чтобы все это было вместе.в противном случае я считаю, что RefreshDatasource должен работать.

Ссылка:
Обновление сетки при использовании пользовательского перечислителя
Как сохранить неизменную позицию прокрутки при обновлении сеткиdata_
Фильтрация объекта DataSource

...