0

我正在尝试创建一个列表,用于存储数据网格视图的数据源,但数据网格视图的数据源类型是“字符串”或“十进制”

我做了这个代码

List<string> list1 = (List<string>)DataGridView.Datasource;
List<decimal> list2 = (List<decimal>)DataGridView.Datasource;

两种不同类型的列表,但我想通过仅声明一个列表来做到这一点,请帮助我..

4

5 回答 5

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

(不确定是否可以从 GridView 投射 DataSource List<dynamic>

于 2013-08-30T14:20:07.567 回答
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;
}

如果您需要将对象键入为字符串或十进制,并且不能将它们仅作为对象使用,那么您会这样做。

于 2013-08-30T14:41:50.533 回答
0

如果DataGridView.datasource是 aList<decimal>那么您将需要实例化一个新列表并手动添加每个对象:

List<object> myList = new List<object>();
foreach(var item in DataGridView.datasource)
{
    myList.Add(item);
}

但正如 DanielMann 所说,你真的应该定义一个适当的类来处理你的两种类型的对象,而不是仅仅将它们硬塞进一个List<object>......

于 2013-08-30T14:33:34.563 回答
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}                  
        };
    }
}
于 2013-08-30T15:00:54.367 回答
-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>();
于 2013-08-30T14:20:32.997 回答