-
Третий день бьюсь со списком (IBindingList) в качестве источника данных (DataSource) для DataGridView. Делаю так:
[c#]
oDataGridView.DataSource = list;
[/c#]
В качестве списка выступает класс
[c#] public abstract class AbstractDBOCollection : IList, IBindingList {}
public abstract class CDBOControllerCollection<TDboController> : AbstractDBOCollection {} [/c#] Элементами списка являются наследники AbstractCollectionEntry
[c#]
public abstract class AbstractCollectionEntry { public abstract void SetKeyFields( params CKeyField[] pKeyFields );
public abstract CDBObjectAbstractController GetController();
public abstract void Save();
public abstract string GetDataString(); } [/c#]
У наследников этого класса есть public свойства, которые и должны выводится в грид. [b]Проблема заключается в том, что в Grid'е не отображаются эти свойства[/b] При присвоении (oDataGridView.DataSource = list) [b]пустого списка[/b], и последующем его заполнении в гриде рисуются пустые строки. Вызов ивэнта ListChanged (см. ниже) как раз таки и приводит к заполнению грида пустыми строками. Если список до биндинга небыл пустым, то свойства отображаются правильно даже при очистке с последующим перезаполнением списка.
[c#]
listChangedEventArgs = new ListChangedEventArgs( ListChangedType.Reset, -1 ); ListChanged( this, listChangedEventArgs );
[/c#]
Вопрос: что делать?
-
Если список до биндинга небыл пустым, то свойства отображаются правильно даже при очистке с последующим перезаполнением списка.
Ну все верно. Так называемая детачед парадигма. При биндинге коллекция должна быть непуста. После биндинга всяческая связь грида и исходного списка пропадает. Это ж бубльгум. В сысле дотнет.
-
если бы связь грида и списка сохранялась бы как в win32 то достаточно было бы вызова oDataGridView.DataSource = list; И никакого метода бинд вообще бы не потребовалось.
-
для DevExpress.XtraGrid.GridControl grid;
grid.DataSource = listofitem; grid.RefreshDataSource();
-
пришел ответ через века, через года, через столетья...
|