【问题标题】:Get items from list inside foreach从 foreach 中的列表中获取项目
【发布时间】:2012-10-19 09:15:53
【问题描述】:

我有一门课,我正在尝试将 datgaridview 填充为通用列表。我在dapuConfigs.CoveredLanes 中遇到问题,这是一个列表,我尝试访问该列表并将其填充到我无法成功的 datagridview 中。可能这两种方法都是错误的......! 请帮帮我??

当我运行时,我在网格单元格中看到一个文本:system colelction generic list。

添加代码:

  .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(),

}); } });

【问题讨论】:

  • CoveredLane 是什么样的,您尝试存储它的什么属性?
  • @Justin Harvey:Everyhting 是一个字符串文本,实际上我正在反序列化一个 xml 文件并在 DGVview 中显示它。
  • 如何将内部列表 (CoveredLanes) 与 gridview 绑定?
  • @Neeraj Kumar Gupta:我想这是我的问题??我如何获得网格视图的内部列表封面。
  • 您希望显示为逗号分隔的字符串或项目列表?

标签: c# xml winforms list datagridview


【解决方案1】:

那么,你在哪里

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(),

或者,用于匹配 Id

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(),

并添加检查不匹配...

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() : "",

【讨论】:

  • 好的,现在我明白我认为你想要的更好,请参阅上面的编辑。
  • 贾斯汀·哈维:如果没有 id 我应该怎么做,因为第三个和第四个 id 是空的,但在另一个元素中它有 4 个 id。谢谢
  • @Justin Harvey:我更喜欢你的第一种方法,如果元素为空,我如何添加空字符串??
  • 对不起,我仍然在元素 2,3 处遇到问题,即第 3 和第 4 值。参数越界异常。我忘了告诉你的一件事实际上在这个列表中它只有 2 个元素,但我在这个列表的 dtagarid 中有 4 个 colmun,所以如果它为空,我想添加空字符串。谢谢。
  • 你没有完全正确,你有 dtuSensorConfigs.CoveredTrafficLanes.ElementAtOrDefault(0).Id == null 你实际上需要 dtuSensorConfigs.CoveredTrafficLanes.ElementAtOrDefault(0) == null
【解决方案2】:

您必须汇总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 事件并更改单元格格式化其数据的方式。这样,您的表示逻辑就不会像我发布的 sn-p 那样渗入模型中。 http://msdn.microsoft.com/en-us/library/2249cf0a.aspx

【讨论】:

  • 在上面的代码中,您将实际列表添加到新对象中。当在该列表上调用 ToString() 时,它将显示为列表的类型名。您想要的是列表中项目的实际 ToString 表示,为此您需要以某种方式组合它们。 string.Join 是将对象数组转换为单个字符串表示形式的一种方法。
  • 你能详细说明一下吗?此错误通常意味着在使用 linq 时编译器无法解析正确的重载。这是 linq 的一个棘手领域,但在这里不应该成为真正的问题。你可以单独测试 string.Join(",", dapuConfigs.CoveredLanes.Where(x => x.Id.Contains("FilterValue1")).ToArray()) 吗?
  • 我刚刚注意到你想要前 4 项,我换成那个了
  • 如果没有id然后不填充单元格我该怎么办?因为第三个和第四个 id 是空的,但在另一个元素中它有 4 个 id。谢谢
【解决方案3】:

你可以这样做

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

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2022-08-15
    • 2019-10-26
    • 2020-10-24
    • 2013-06-15
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多