首页 新闻 会员 周边 捐助

winform神人进。超级难题

-1
[已关闭问题] 关闭于 2012-12-24 22:45

namespace WindowsFormsApplication1
{
    public partial class Myform : Form
    {
        public BindingList跨线程绑定使用SynchronizationContext()
        {
            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方式中 报错!!对象的当前状态使该操作无效。

 

请问高手是怎么回事!!!

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2012-12-23 18:18
< >
分享
所有回答(1)
0

你这个写法肯定报错,dataGridView1 应该是页面控件,只有主线程可以这么写。

可以参考这个写法

 Action action = () =>
                {
                    _list.Add(new OBJ { Name = "C#" });
                   
                };
            if (this.InvokeRequired)
            {
                this.Invoke(action);
            }
            else
            {
                action();
            }
卒子 | 园豆:588 (小虾三级) | 2012-12-24 11:04

您肯定是没有用过SynchronizationContext这个...!!!那种是最原始的写法、、

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2012-12-24 13:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册