2012-10-19 123 views
0

我有一個類,我試圖填充datatidview作爲通用列表。我在dapuConfigs.CoveredLanes中遇到了一個問題,這是一個列表,我試圖訪問該列表,並在datagridview中填充它,以免coulmdn't成功。可能兩種方法都是錯誤的! 請幫幫我?從列表中獲取項目foreach

當我運行,我得到一個文本出現在網格單元格:系統colelction通用列表。

添加的代碼:

.ForEach(
       Configs => 
        { 
         { 
          datagridview1.Rows.Add(
           new object[] 
            { 
             Configs.Id, 
             Configs.Description, 
             Configs.Covered.ElementAtOrDefault(0).Id == null ? "" : Configs.Covered.ElementAtOrDefault(0).Id.ToString(), 
             Configs.Covered.ElementAtOrDefault(1).Id == null ? "" : Configs.Covered.ElementAtOrDefault(1).Id.ToString(), 
             Configs.Covered.ElementAtOrDefault(2).Id == null ? "" : Configs.Covered.ElementAtOrDefault(2).Id.ToString(), 
             Configs.Covered.ElementAtOrDefault(3).Id == null ? "" : Configs.Covered.ElementAtOrDefault(3).Id.ToString(), 

}); } });

+0

什麼CoveredLane變成什麼樣子,你嘗試存儲是什麼性質的呢? –

+0

@Justin Harvey:Everyhting是一個字符串文本,實際上我將一個xml文件取消分離並顯示在DGVview中。 – linguini

+0

如何使用gridview綁定innerlist(CoveredLanes)? –

回答

2

所以,你在你的第一個例子有

dapuConfigs.CoveredLanes.ToList(), 

,嘗試更改爲:

dapuConfigs.CoveredLanes.ElementAtOrDefault(0) == null ? "" : dapuConfigs.CoveredLanes.ElementAt(0).ToString(), 
dapuConfigs.CoveredLanes.ElementAtOrDefault(1) == null ? "" : dapuConfigs.CoveredLanes.ElementAt(1).ToString(), 
dapuConfigs.CoveredLanes.ElementAtOrDefault(2) == null ? "" : dapuConfigs.CoveredLanes.ElementAt(2).ToString(), 
dapuConfigs.CoveredLanes.ElementAtOrDefault(3) == null ? "" : dapuConfigs.CoveredLanes.ElementAt(3).ToString(), 

或者,在標識

匹配
dapuConfigs.CoveredLanes.First(cl=>cl.Id=="").ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id=="").ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id=="").ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id=="").ToString(), 

或更一般匹配ID ...

dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString(), 
dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString(), 

和d增加了對不匹配的支票......

dapuConfigs.CoveredLanes.Any(cl=>cl.Id.Contains("")) ? dapuConfigs.CoveredLanes.First (cl=>cl.Id.Contains("")).ToString() : "", 
dapuConfigs.CoveredLanes.Any(cl=>cl.Id.Contains("")) ? dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString() : "", 
dapuConfigs.CoveredLanes.Any(cl=>cl.Id.Contains("")) ? dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString() : "", 
dapuConfigs.CoveredLanes.Any(cl=>cl.Id.Contains("")) ? dapuConfigs.CoveredLanes.First(cl=>cl.Id.Contains("")).ToString() : "", 
+0

你的代碼工作,但它顯示eveything在一個單元格 – linguini

+0

好吧,現在我明白我想你想要的更好,請參閱上面的編輯。 –

+0

Justin Harvey:如果沒有id,我會做什麼,因爲第三個和第四個id是空的,但是在另一個元素中它有四個id。謝謝 – linguini

1

您必須彙總dapuConfigs.CoveredLanes中的值才能在該字段中顯示。作爲一個例子,如果有字符串值,你可以這樣做:

string.Join(",", dapuConfigs.CoveredLanes.ToArray()) 

生成一個逗號分隔列表。

或顯示前4項,那麼你將創建你的對象,像這樣:

new object[] 
{ 
dapuConfigs.Id,   //col0 
dapuConfigs.Description, //col1 
dapuConfigs.CoveredLanes.ElementAt(0), //col2 
dapuConfigs.CoveredLanes.ElementAt(1),//col3 
dapuConfigs.CoveredLanes.ElementAt(2), //col4 
dapuConfigs.CoveredLanes.ElementAt(3),//col5 
dapuConfigs.Position.Value, //col6 
dapuConfigs.Position.Value,//col7 
} 

而且這將是明智的抽象格式代碼擄到的某些種類的格式化對象。

解決此問題的一種更加獨立的方法是掛接到CellFormatting事件並更改單元格格式化其數據的方式。這樣,您的表示邏輯就不會像我在發佈的代碼片段中那樣流入模型。 http://msdn.microsoft.com/en-us/library/2249cf0a.aspx

+0

您能否詳細介紹一下您的代碼。 – linguini

+0

在上面的代碼中,您正在將實際列表添加到新對象中。當ToString()在該列表上被調用時,它將顯示爲列表的類型名稱。你想要的是列表中項目的實際ToString表示,並且需要將它們以某種方式組合起來。 string.Join是將對象數組轉換爲單個字符串表示形式的一種方法。 – MrDosu

+0

@ MrDosu:我應該在哪裏放置你的代碼? – linguini

1

你可以像這樣

private void BindGrid() 
{ 
    List<string> lst = new List<string>(); 
    lst.Add("A"); 
    lst.Add("D1"); 
    lst.Add("A2"); 
    lst.Add("A3"); 

    List<Test> tst = new List<Test>(); 
    Test t = new Test(); 
    t.ListValue = lst; 
    t.ID = 1; 
    tst.Add(t); 

    lst = new MyList(); 
    lst.Add("B"); 
    lst.Add("B1"); 
    lst.Add("A2"); 
    lst.Add("B3"); 

    t = new Test(); 
    t.ListValue = lst; 
    t.ID = 2; 
    tst.Add(t); 

    lst = new MyList(); 
    lst.Add("C"); 
    lst.Add("B1"); 
    lst.Add("C2"); 
    lst.Add("C3"); 

    t = new Test(); 
    t.ListValue = lst; 
    t.ID = 3; 
    tst.Add(t); 
    ArrayList a = new ArrayList(); 
    try 
    { 
     var lst2 = (from b in tst 
        select new 
        { 
         b.ID, 
         col2 = string.Join(Environment.NewLine, b.ListValue.Where(x => x.StartsWith("A")).ToArray()), 
         col3 = string.Join(Environment.NewLine, b.ListValue.Where(x => x.StartsWith("B")).ToArray()), 
         col4 = string.Join(Environment.NewLine, b.ListValue.Where(x => x.StartsWith("C")).ToArray()) 
        }).ToList(); 

     GridView1.DataSource = lst2; 
     GridView1.DataBind(); 
    } 
    catch (Exception ex) 
    { 
     string ss = ex.Message; 
    } 

} 

public class Test 
{ 
public int ID { get; set; } 
public List<string> ListValue { get; set; } 
}