2013-08-30 92 views
0

我想做一个列表,用于存储数据网格视图的数据源 但数据网格视图的数据源的类型是“字符串”或“十进制”有没有办法做出两种不同类型的列表

我做了这个代码

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

两种不同类型的列表,但我想通过声明只有一个列表 请帮我做这个..

+3

如果以列表形式输入 ??? –

+5

为什么不制作一个代表您的模型的对象而不是将异构数据存储在列表中? –

+0

你能告诉我你的DataGridView.datasource类型吗?意味着你已经分配了哪种类型的对象? –

回答

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; 
} 

这将是你会怎么做,如果你需要有类型为字符串或小数的对象,不能像对象那样与他们一起工作。

+0

很好的解释,为什么列表不起作用。第二种选择要简单得多。喜欢它。 – Kaf

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的数据源是可能的List<dynamic>

+0

我做了这段代码,它给了我错误:List li = new List (); li.Add(10); li.Add(10); dataGridView1.DataSource = li; 列表 ss =(列表)dataGridView1.DataSource; –

+0

使用动态是不是工作压力太大同样的错误来了 –

+0

'List'不协变,这就是为什么这是不行的。您需要将这两个列表创建为'List ',因此这是一个选项。 – Servy

-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>(); 
+0

没有它给我的错误 –

+0

无法投类型的对象System.Collections.Generic.List'1 [System.Decimal]为键入“System.Collections.Generic.List'1 [System.Object的]”。 –

+0

请帮助我,我真的卡在这个 –

0

如果DataGridView.datasourceList<decimal>,那么你将需要实例化一个新的列表,并手动添加的每个对象:

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

但作为DanielMann说,你真的应该定义一个适当的类来处理你的两个对象的类型,而不仅仅是将它们锁到一个List<object> ...

0

由于没有人提到这个尚未...

还有,你可以用它来存储不同类型的对象在一个IList的兼容集合CompositeCollection。

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}     
     }; 
    } 
} 
相关问题