我从序列化为XML字符串的集合中填充DataGridView(示例代码:*)。
我的要求是:(1)将图像放入DataGridView;(2)设置bindingSource.Filter字符串并根据列中的字符串动态过滤表(可能有数千个条目)。我的奇怪的XML下面的字符串hack适用于Filter,但是我不能将图像去/从字符串序列化,所以我不能创建一个神奇的DataView,其中.Filter正常工作。
问题:(a)是否有更好的方法将RAM中的DataView集合转换为dataGridView,而不是序列化为XML字符串(以获取DataView),但需要注意的是.Filter仍然原理的。 (b)是否有另一种方法可以在运行时向bindingSource / DataView添加内容(特别是Image列),这样可以保留.Filter的使用?
从我的测试中,做事this way (How to: Bind Objects to Windows Forms DataGridView Controls)会使得过滤字段设置无法操作,即什么都不做,没有例外,没有魔法过滤,虚无..
(*)
// 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";
}
答案 0 :(得分:1)
(完全重写)你甚至不需要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}
}
});
}