2010-03-31 3 views
0

Я пытаюсь привязать таблицу структур к DataGridView. Загрузка и просмотр таблицы работает нормально, но я не могу изменить значение и вернуть его обратно в таблицу. Вот что я делаю.Связанный DataGridView не обновляет источник данных

У меня есть «примитивный» тип данных, Real, определенный

public struct MyReal:IMyPrimative 
{ 
    public Double m_Real; 
    //... 
    public MyReal(String val) 
    { 
     m_Real = default(Double); 
     Init(val); 
    } 
    //... 
} 

Он привыкает в структуре:

public struct MyReal_Record : IMyRecord 
{ 
    public MyReal Freq { get; set;} 
    MyReal_Record(String[] vals) 
    { 
     Init(vals); 
    } 
} 

и структура используется для определения таблицы с использованием общего Binding Список

public class MyTable<S> : BindingList<S> where S: struct, IMyRecord 
{ 
    public Type typeofS; 
    public MyTable() 
    { 
     typeofS = typeof(S); 
     // ... 
    } 

Эта таблица используется как источник связывания для сетки динамически.

private void miLoadFile_Click(object sender, EventArgs e) 
    { 
     MyModel.Table<Real_Record> RTable = new MyModel.Table<Real_Record>(); 
     //... Table initialized here 

     //set up grid with virtual mode 
     dataGridView1.DataSource = RTable; 
    } 

Все это прекрасно работает, и я могу создать RTable, инициализировать его и отобразить в сетке. Сетка позволяет редактировать и имеет событие, установленное для CellParsing и CellFormatting, которые выглядят как:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.DesiredType != typeof(String)) 
      return; 
     e.Value = e.Value.ToString(); 
    } 

    private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e) 
    { 
     if (e.DesiredType != typeof(MyReal)) 
      return; 
     e.Value = new MyReal(e.Value.ToString()); 
     e.ParsingApplied = true; 
     this.dataGridView1.UpdateCellValue(e.ColumnIndex, e.RowIndex); 
    } 

Когда я изменить значение в ячейке, я могу изменить текст. При выходе из ячейки вызывается пожар CellParsing и обработчик событий. Кажется, что все правильно идет в обработчик CellParsing. e.DesiredType - это MyReal. e.Value - это строка с новым значением. После создания нового MyReal из строки e.Value устанавливается правильно. RowIndex и ColumnIndex верны. ReadOnly установлен false.

Однако, когда я покидаю ячейку, система восстанавливает исходное значение в ячейке. Я думал, UpdateCellValue заменит значение в dataSource, но я, кажется, что-то не хватает.

Что я пропустил?

Спасибо, Max

ответ

0

Я нашел ответ на другом форуме (social.msdn.microsoft.com) благодаря Аландских Ли.

«Когда мы привязываем списка объектов управления, объекты в списке должны быть ссылочного типа, а не типа значения. Другими словами, Real_Record должен определить как класс.

Если Real_Record имеет значение type, копия элемента Real_Record в списке переносится в DataGridView для инициализации привязки. Когда изменяется значение Real, копия Real_Record изменяется, но старый элемент в списке не изменяется. "

Если кто знает, как обойти это ограничение, я бы хотел его услышать. Макс.

Смежные вопросы