Получение изображений и bindingSource.Filter, работающих вместе в DataGridView - PullRequest
1 голос
/ 20 июня 2009

Я заполняю 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";
}

1 Ответ

1 голос
/ 20 июня 2009

(полное переписывание) Вам даже не нужен xml; если вы используете ToDataTable , отлично работает следующее:

public class MyType
{
    public string Name { get; set; }
    public Image Image { get; set; }
}
...
[STAThread]
static void Main()
{
    List<MyType> list = new List<MyType>();
    list.Add(new MyType { Image=Bitmap.FromFile(image1Path), Name="Fred" });
    list.Add(new MyType { Image=Bitmap.FromFile(image2Path), Name="Barney" });

    DataTable table = list.ToDataTable();
    BindingSource bs = new BindingSource(table, "");
    bs.Filter = @"Name = 'Fred'";
    Application.Run(new Form {
        Controls = {
            new DataGridView {
                DataSource = bs,
                Dock = DockStyle.Fill}
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...