Я заполняю DataGridView из коллекции, сериализованной в строку XML (пример кода: *).
Мои требования: (1) получить изображения в DataGridView и (2) возможность установить строку bindingSource.Filter и динамически фильтровать таблицу на основе строк в столбцах (возможно, для тысяч записей). Мой странный взлом XML в строку ниже работает для Filter, но я не могу де / сериализовать Изображения в / из строки, поэтому я не могу создать волшебный DataView, где .Filter работает правильно.
Вопрос (ы): (a) Есть ли лучший способ получить коллекцию объектов DataView из оперативной памяти в dataGridView, чем сериализацию в строку XML (для получения DataView) с предупреждением о том, что .Filter все еще работает . (b) Есть ли альтернативный способ добавить материал в bindingSource / DataView во время выполнения (особенно столбец Image), который сохраняет использование .Filter?
Из моих тестов, делая вещи таким образом (Как: привязать объекты к элементам управления DataGridView в Windows Forms) делает настройку поля фильтра неработоспособной, то есть ничего не делать, никаких исключений, никакой магической фильтрации, нада. 1011 *
(*)
// objects in each row
[Serializable]
public class GradorCacheFile
{
public Bitmap image;
public string filename;
// to make it serializable
public GradorCacheFile()
{
}
public GradorCacheFile(GradorCacheFile old)
{
this.filename = old.filename;
this.image = old.image;
}
}
// snippet of class:
public List<GradorCacheFile> files = null;
void Process()
{
GradorCacheFiles gcf = new GradorCacheFiles();
gcf.AddRange(this.files);
XmlSerializer xs = new XmlSerializer(typeof(GradorCacheFiles));
StringWriter sw = new StringWriter();
xs.Serialize(sw, gcf);
sw.Close();
string xml = sw.ToString();
StringReader reader = new StringReader(xml);
DataSet ds = new DataSet();
ds.ReadXml(reader);
if (ds.Tables.Count < 1)
return;
DataTable dt = ds.Tables[0];
DataView dv = new DataView(dt);
this.bindingSource = new BindingSource();
this.bindingSource.DataSource = dv;
this.dataGridView.DataSource = this.bindingSource;
int rows = this.dataGridView.Rows.Count;
if (rows == 0)
return;
this.dataGridView.Columns[0].HeaderText = "Image";
this.dataGridView.Columns[1].HeaderText = "File";
}