2016-01-11 3 views
1

У меня есть список с объектом типа данных, который я пытаюсь заполнить, а затем читать в строку. Список должен содержать данные для каждого столбца в 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, ширина, Visible, ColumnIndex, DisplayIndex, ширина, Visible, ColumnIndex ...и так далее. Проблема в том, что все, что я читаю, составляет 0,1,2, что похоже на ColumnIndex для трех столбцов под dsgDataGrid, который является DataGridView. Кто-нибудь знает, как я могу вывести все данные в одну строку?

Спасибо.

+1

Попробуйте переопределить метод ToString в ColumnOrderItem – Neijwiert

ответ

4

Самый лучший вариант для вас 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 
+0

'string.Join Метод (String, IEnumerabl e ) 'должен делать практически то же, что и ваш пример« Как использовать ». – Neijwiert

+0

Единственное, что, я полагаю, ошибочно, - это то, что OP хочет выводить для одного элемента в одной строке. Но я полагаю ... – Steve

2

Вы можете определить ToString для ColumnOrderItem и использовать

THX для информирования меня о вызове, вызванном ToString от String.join @Neijwiert

Eg:

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

Когда вы звоните String.join(spliter,enums:IEnumerable<T>)

Он работает так же, как String.join(spliter,enums.Select(i->i.toString()))

Регистрация (String, IEnumerable) удобный метод, который позволяет вы объединяете каждого члена коллекции IEnumerable, не преобразовывая их сначала в строки. Строковое представление каждого объекта в коллекции IEnumerable происходит путем вызова метода ToString этого объекта.

String.Join Method (String, IEnumerable)-MSDN

+1

Не нужно использовать лямбда-выражение для вызова ToString. 'string.Join Метод (String, IEnumerable )' уже делает это. – Neijwiert

+0

Err, я не уверен, что соединение будет делать это, поскольку я не тестировал его. Thx, чтобы рассказать мне. – Twiknight

+0

См. [Это] (https://msdn.microsoft.com/en-us/library/dd992421 (v = vs.110) .aspx) – Neijwiert

0

вы, возможно, придется добавить ToString переопределение в вашем ColumnOrderItem класса, как:

 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); это должно дать вам выход вы хотели, например enter image description here

+1

Хотя уже ответил, он содержит пример, который использует 'string.Join'.Однако вы должны использовать 'StringBuilder' для такого рода вещей. – Neijwiert