【问题标题】:Reading items from list and display it as string从列表中读取项目并将其显示为字符串
【发布时间】:2016-01-11 09:52:03
【问题描述】:

我有一个包含对象数据类型的列表,我正在尝试填充该列表,然后将其读出为字符串。该列表应包含 DataGridView 中每一列的数据:

[Serializable]
public sealed class ColumnOrderItem
{
    public int DisplayIndex { get; set; }
    public int Width { get; set; }
    public bool Visible { get; set; }
    public int ColumnIndex { get; set; }
}

private void test()
{

List<ColumnOrderItem> columnOrder = new List<ColumnOrderItem>();
                DataGridViewColumnCollection columns = dsgDataGrid.Columns;
                for (int i = 0; i < columns.Count; i++)
                {
                    columnOrder.Add(new ColumnOrderItem
                    {
                        ColumnIndex = i,
                        DisplayIndex = columns[i].DisplayIndex,
                        Visible = columns[i].Visible,
                        Width = columns[i].Width

                    });
                }

                colData = string.Join(",", columnOrder);

MessageBox.Show(colData);
}

我期望的是 MessageBox 应该按顺序显示每个项目的值,如 DisplayIndex、Width、Visible、ColumnIndex、DisplayIndex、Width、Visible、ColumnIndex ......等等。问题是我读回的只是 0,1,2,这似乎只是 dsgDataGrid 下 3 列的 ColumnIndex,它是一个 DataGridView。有谁知道我如何将所有数据输出到单个字符串?

谢谢。

【问题讨论】:

  • 尝试覆盖 ColumnOrderItem 中的 ToString 方法

标签: c# list datagridview


【解决方案1】:

您的最佳选择是override the ToString method 因此您的类定义如下:

[Serializable]
public sealed class ColumnOrderItem
{
    public int DisplayIndex { get; set; }
    public int Width { get; set; }
    public bool Visible { get; set; }
    public int ColumnIndex { get; set; }
    public override string ToString()
    {
        StringBuilder overRideString = new StringBuilder();
        overRideString.AppendLine("DisplayIndex" + DisplayIndex.ToString());
        overRideString.AppendLine("Width" + Width.ToString());
        overRideString.AppendLine("Visible" + Visible.ToString());
        overRideString.AppendLine("ColumnIndex" + ColumnIndex.ToString());
        return overRideString.ToString();
    }
}

使用方法:

StringBuilder details = new StringBuilder();   
foreach (ColumnOrderItem item in columnOrder)
{
   details.AppendLine(item.ToString());  
}
details.ToString(); // this will give you the required result

【讨论】:

  • string.Join&lt;T&gt; Method (String, IEnumerable&lt;T&gt;) 应该与您的 How to use 示例几乎相同。
  • 我认为唯一错误的是 OP 希望输出单行中的单个项目。但我想...
【解决方案2】:

您可以为ColumnOrderItem 定义ToString 并使用

感谢您告知我 ToStringString.join @Neijwiert 隐含调用

例如:

public string ToString()
{
  return string.Format("{0},{1},{2},{3}",
               this.ColumnIndex,
               this.DisplayIndex,
               this.Visible,
               this.Width);
}

当您致电String.join(spliter,enums:IEnumerable&lt;T&gt;)

String.join(spliter,enums.Select(i-&gt;i.toString()))作用相同

Join(String, IEnumerable) 是一种方便的方法,可让您连接 IEnumerable 集合的每个成员,而无需先将它们转换为字符串。 IEnumerable 集合中每个对象的字符串表示形式是通过调用该对象的 ToString 方法派生的。

String.Join Method (String, IEnumerable)-MSDN

【讨论】:

  • 无需使用 lambda 表达式来调用 ToString。 string.Join&lt;T&gt; Method (String, IEnumerable&lt;T&gt;) 已经这样做了。
  • Err,我不确定 join 是否会这样做,因为我还没有测试过。谢谢你告诉我。
【解决方案3】:

您可能必须在 ColumnOrderItem 类中添加一个 ToString 覆盖,例如:

        public override string ToString()
        {
            return string.Format(
                "[DisplayIndex: {0}, Width: {1}, Visible: {2}, ColumnIndex: {3}]\n",
                DisplayIndex,
                Wi`enter code here`dth,
                Visible,
                ColumnIndex);


        }

那么当您执行var colData = string.Join(",", columnOrder); 时,这应该会为您提供您想要的输出,例如

【讨论】:

  • 虽然已经回答,但它确实包含一个使用 string.Join 的示例。但是,您应该使用StringBuilder 处理这些事情。
猜你喜欢
  • 2016-01-12
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
相关资源
最近更新 更多