![](/img/trans.png)
[英]C# DataGridView throws exception when removing object from BindingList
[英]Exception when Asynchoon loading of datagridview bindinglist
当我尝试加载datagridview异步时,我收到一条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; }
}
我认为DataGridView控件尚未针对该操作处于就绪状态,因此它将无法在构造函数中使用,并且Load方法似乎也为时过早,因此请尝试使用OnShown重写方法:
protected override void OnShown(EventArgs e) {
base.OnShown(e);
_gv.LoadAsync(_persons);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.