【问题标题】:Exception when Asynchoon loading of datagridview bindinglist异步加载datagridview绑定列表时出现异常
【发布时间】:2014-02-06 12:12:11
【问题描述】:

当我尝试加载 datagridview asyncroon 时,我收到 InvalidOperationException 消息:“由于对象的当前状态,操作无效。” 当我将一个项目添加到 BindingList 并且需要调用时,就会发生这种情况。没有线程就不会抛出异常。非常感谢任何帮助。

这些是我用来向 DataGridview 添加项目的方法:

public static class ExtensionMethods
{
    public static void LoadAsync<T>(this DataGridView gv, IEnumerable<T> enumerable)
    {
        gv.DataSource = new BindingList<T>();
        new Thread(() => gv.LoadItems(enumerable)) { IsBackground = true, Name = "AsyncLoad" }.Start();
    }

    private static void LoadItems<T>(this DataGridView gv, IEnumerable<T> enumerable)
    {
        foreach (T item in enumerable)          
            gv.AddItemToDataSourche(item);          
    }

    private static void AddItemToDataSourche<T>(this DataGridView gv, T item)
    {
        if (gv.InvokeRequired)
            gv.Invoke(new Action(() => gv.AddItemToDataSourche(item)));
        else
            ((BindingList<T>)gv.DataSource).Add(item); //This is where it goes wrong.
    }
}

这就是我实例化 DataGridView 的方式:

public partial class Form1 : Form
{
    private DataGridView _gv = new DataGridView();
    private readonly IEnumerable<Person> _persons = new List<Person>
        {
            new Person {ID = 1, FirstName = "Test 1", LastName = "Someone"},
            new Person {ID = 2, FirstName = "Test 2", LastName = "Someone"},
            new Person {ID = 3, FirstName = "Test 3", LastName = "Someone"}
        };

    public Form1()
    {
        InitializeComponent();
        Controls.Add(_gv);
        _gv.LoadAsync(_persons);            
    }
}

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

【问题讨论】:

    标签: c# multithreading datagridview


    【解决方案1】:

    我认为 DataGridView 控件尚未处于该操作的就绪状态,因此它在构造函数中不起作用,并且 Load 方法似乎也太早了,因此请尝试使用 OnShown 覆盖方法:

    protected override void OnShown(EventArgs e) {
      base.OnShown(e);
      _gv.LoadAsync(_persons);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多