我知道这个错误有线程,但我只找到解决方案,以防数据源是一个表。 就我而言,数据源是一个列表。这是我的代码:
private void AdminForm_Load(object sender, EventArgs e)
{
dgUser.DataSource = read.getUsers();
dgUser.Rows.Add();
}
显然,Add()方法对集合不起作用。任何解决方案?
答案 0 :(得分:2)
List<String> list = new List<String>();
list.add("val1");
dataGridView1.DataSource = list;
list.add("val2");
dataGridView1.DataSource = null;
dataGridView1.DataSource = list;
在这种情况下,您必须将datasource设置为null,然后再次列出; 或者更好地使用绑定列表
BindingList <String> list = new BindingList<String>();
list.Add("val1");
dataGridView1.DataSource = list;
list.Add("val1");
在这种情况下,你不必“刷新”任何东西,它会自动完成
答案 1 :(得分:0)
请尝试以下代码。另外,您可以在第4行检查收集类型。
private bool AddNewRow(DataGridView grid)
{
var collection = grid.DataSource;
if (collection == null)
{
grid.Rows.Add();
return true;
}
var itemType = GetCollectionItemType(collection.GetType());
if (itemType != null && itemType != typeof(object) && !itemType.IsAbstract && itemType.GetConstructor(Type.EmptyTypes) != null)
{
try
{
dynamic item = Activator.CreateInstance(itemType);
((dynamic)collection).Add(item);
if (!(collection is System.ComponentModel.IBindingList))
{
grid.DataSource = null;
grid.DataSource = collection;
}
return true;
}
catch { }
}
return false;
}
public static Type[] GetGenericArguments(this Type type, Type genericTypeDefinition)
{
if (!genericTypeDefinition.IsGenericTypeDefinition)
return Type.EmptyTypes;
if (genericTypeDefinition.IsInterface)
{
foreach (var item in type.GetInterfaces())
if (item.IsGenericType && item.GetGenericTypeDefinition().Equals(genericTypeDefinition))
return item.GetGenericArguments();
}
else
{
for (Type it = type; it != null; it = it.BaseType)
if (it.IsGenericType && it.GetGenericTypeDefinition().Equals(genericTypeDefinition))
return it.GetGenericArguments();
}
return new Type[0];
}
public static Type GetCollectionItemType(Type collectionType)
{
var args = GetGenericArguments(collectionType, typeof(IEnumerable<>));
if (args.Length == 1)
return args[0];
return typeof(IEnumerable).IsAssignableFrom(collectionType)
? typeof(object)
: null;
}
答案 2 :(得分:0)
var dataSource = datagrid.DataSource;
(dataSource as IList).Add(obj);
datagrid.DataSource = null;
datagrid.DataSource = dataSource;
datagrid.Refresh();