namespace WindowsFormsApplication1
{
public partial class Myform : Form
{
public Myform()
{
InitializeComponent();
Initial();
}
public UiBindList<OBJ> _list { get; set; }
private void Initial()
{
_list = new UiBindList<OBJ> { SynchronizationContexts = SynchronizationContext.Current };
dataGridView1.DataBindings.Add("DataSource", this, "_list", false, DataSourceUpdateMode.OnPropertyChanged);
new Thread(() =>
{
while (true)
{
Thread.Sleep(1000);
_list.Add(new OBJ { Name = "C#" });
}
})
{
IsBackground = true,
}
.Start();
}
}
public class UiBindList<T> : BindingList<T>
{
public SynchronizationContext SynchronizationContexts { get; set; }
public void Excute(Action action, object state = null)
{
if (SynchronizationContexts == null)
action();
else
SynchronizationContexts.Post(p => action(), state);
}
public new void Add(T item)
{
Excute(() => base.Add(item));
}
public new void Remove(T item)
{
Excute(() => base.Remove(item));
}
}
public class OBJ { public string Name { get; set; } }
在Add方式中 报错!!对象的当前状态使该操作无效。
public new void Add(T item) { Excute(() => Add(item)); } public new void Remove(T item) { Excute(() => Remove(item)); }
这两个方法去掉base.的引用就好了,改为上面的调用
这样虽然不报错了,但是窗口会一直处于卡死状态,如果不考虑使用SynchronizationContext的话,可以考虑使用下面的代码
public List<OBJ> _list = new List<OBJ>(); private void Initial() { Thread th = new Thread(() => { while (true) { Thread.Sleep(1000); _list.Add(new OBJ { Name = "C#" }); this.Invoke(new Action(() => { dataGridView1.DataSource = null; dataGridView1.DataSource = _list; })); } }); th.Start(); }
@RyanCheng: 这种方式我会..想用下其它的方式而已。。
_list.Add(new OBJ(){Name="C#"}); 是不是这里少写了小括号?
c#3.0就可以这么写了。对象自动化。。没有问题的。
while (true)
{
Thread.Sleep(1000);
_list.Add(new OBJ { Name = "C#" });
}
_list.Add(new OBJ { Name = "C#" });这句没有写括号,_list.Add(new OBJ(){Name="C#"});