我正在尝试创建一个用于存储数据网格视图数据源的列表 但是数据网格视图的数据源类型是“字符串”或“十进制”
我制作了这段代码
List<string> list1 = (List<string>)DataGridView.Datasource;
List<decimal> list2 = (List<decimal>)DataGridView.Datasource;
两种不同类型的列表,但我想通过仅声明一个列表来实现此目的 请帮帮我..
答案 0 :(得分:4)
使用List<object>
或更糟ArrayList
(请不要使用ArrayList)。
List<object> list = (List<object>)DataGridView.datasource;
您还可以查看List<dynamic>
List<dynamic> list = new List<dynamic>();
list.Add(1);
list.Add("ABCD");
list.Add(1f);
foreach (var item in list)
{
Console.WriteLine(item.GetType());
}
,输出为:
System.Int32
System.String
System.Single
(不确定是否可以从List<dynamic>
投射GridView中的DataSource
答案 1 :(得分:2)
如果需要,可以将数据源强制转换为IList
(非通用版本)。
IList data = (IList)DataGridView.Datasource;
这将允许您以object
类型访问列表中的项目。
另一个选择是简单地检查列表的类型并采取相应的行动:
if(DataGridView.Datasource is List<string>)
{
List<string> list = (List<string>)DataGridView.Datasource;
}
else
{
List<decimal> list = (List<decimal>)DataGridView.Datasource;
}
如果您需要将对象键入为字符串或小数,并且无法将它们作为对象使用,那么您将会这样做。
答案 2 :(得分:0)
如果DataGridView.datasource
是List<decimal>
,那么您需要实例化一个新列表并手动添加每个对象:
List<object> myList = new List<object>();
foreach(var item in DataGridView.datasource)
{
myList.Add(item);
}
但正如DanielMann所说,你真的应该定义一个合适的类来处理你的两种类型的对象,而不是仅仅将它们变成List<object>
......
答案 3 :(得分:0)
因为还没有其他人提到过这个......
还有一个CompositeCollection可用于在一个兼容IList的集合中存储不同类型的对象。
public class MyObject()
{
public string SomeData { get; set; }
public int SomeOtherData { get; set; }
}
public class MyOtherObject()
{
public Guid ID { get; set; }
public object Foo { get; set; }
}
public class Main()
{
private List<MyObject> objects = new List<MyObject>();
private List<MyOtherObject> moreObjects = new List<MyOtherObject>();
public CompositeCollection TheCollection { get; private set; }
public Main()
{
//mock adding data to the list
objects.Add( ... );
moreObjects.Add ( ... );
//Build the composite collection
TheCollection = new CompositeCollection
{
new CollectionContainer {Collection = objects},
new CollectionContainer {Collection = moreObjects}
};
}
}
答案 4 :(得分:-1)
List<object> genericList = (List<object>)DataGridView.datasource;
会解决这个问题吗?
以下是使用LINQ的示例转换。
List<decimal> dList = new List<decimal>();
List<object> oList = new List<object>();
oList = dList.Select(x => (object)x).ToList<object>();