我正在尝试创建一个列表,用于存储数据网格视图的数据源,但数据网格视图的数据源类型是“字符串”或“十进制”
我做了这个代码
List<string> list1 = (List<string>)DataGridView.Datasource;
List<decimal> list2 = (List<decimal>)DataGridView.Datasource;
两种不同类型的列表,但我想通过仅声明一个列表来做到这一点,请帮助我..
我正在尝试创建一个列表,用于存储数据网格视图的数据源,但数据网格视图的数据源类型是“字符串”或“十进制”
我做了这个代码
List<string> list1 = (List<string>)DataGridView.Datasource;
List<decimal> list2 = (List<decimal>)DataGridView.Datasource;
两种不同类型的列表,但我想通过仅声明一个列表来做到这一点,请帮助我..
使用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
(不确定是否可以从 GridView 投射 DataSource List<dynamic>
)
如果需要,您可以将数据源转换为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;
}
如果您需要将对象键入为字符串或十进制,并且不能将它们仅作为对象使用,那么您会这样做。
如果DataGridView.datasource
是 aList<decimal>
那么您将需要实例化一个新列表并手动添加每个对象:
List<object> myList = new List<object>();
foreach(var item in DataGridView.datasource)
{
myList.Add(item);
}
但正如 DanielMann 所说,你真的应该定义一个适当的类来处理你的两种类型的对象,而不是仅仅将它们硬塞进一个List<object>
......
因为还没有人提到这个...
还有一个 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}
};
}
}
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>();