Связанный DataGridView не обновляет источник данных - PullRequest
0 голосов
/ 31 марта 2010

Я пытаюсь связать таблицу структур с 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);
    }
}

И структура используется для определения таблицы, используя общий список привязок

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 заменит значение в источнике данных, но мне кажется, что-то не хватает.

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

Спасибо, Max

1 Ответ

0 голосов
/ 11 апреля 2010

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

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

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

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

...