2016-10-23 5 views
0

Я пытаюсь связать связанный список с datagridview. Метод ниже работает для свойств в классе, кроме массива. Если я объявляю массив как новый экземпляр, связанный список создается правильно, но массив не связан с datagridview. Если массив создан как свойство (я думаю, что код верен) вызывает An unhandled exception of type 'System.StackOverflowException' occurred при создании связанного списка.Связать связанный список с datagridview

Спасибо за любую помощь.

public class PayoffNode 
       { 
        public int DealNo { get; set; } 
        public string Category { get; set; } 
        public string Strategy { get; set; } 
        public string GreekType { get; set; } 
        // declare array as instance or as a property? 
        //public double[] Data = new double[22]; 
        public double[] Data 
        { 
         get { return Data; } 
         set { Data = value; } 
        } 
       } 

    LinkedList<Globals.PayoffNode> PayLL = new LinkedList<Globals.PayoffNode>(); 
       Random Rnd = new Random(); 
       for (int K = 1; K <= 10; K++) 
       { 
        var T = new Globals.PayoffNode(); 
        T.Category = "Account==" + K; 
        T.GreekType = "Greek==" + K; 
        T.DealNo = K; 
        T.Strategy = "Strategy==" + K; 
        for (int DP = 1; DP <= 21; DP++) 
        { 
         T.Data[DP] = Rnd.Next(10, 99); 
        } 
        PayLL.AddLast(T); 
       } 

       List<Globals.PayoffNode> qP = (from P in PayLL 
               where P.Category == "Account==4" && P.DealNo == 4 && P.GreekType == "Greek==4" && P.Strategy == "Strategy==4" 
               select P).ToList(); 

    PayoffTable.DataSource = qP; 

Update: Спасибо за комментарии, это, кажется, работает.

public class PayoffNode 
      { 
       public int DealNo { get; set; } 
       public string Category { get; set; } 
       public string Strategy { get; set; } 
       public string GreekType { get; set; } 
       public double Data1 { get; set; } 
       public double Data2 { get; set; } 
       public double Data3 { get; set; } 
       public double[] Data = new double[22]; 
      } 

LinkedList<Globals.PayoffNode> PayLL = new LinkedList<Globals.PayoffNode>(); 
      Random Rnd = new Random(); 
      for (int K = 1; K <= 10; K++) 
      { 
       var T = new Globals.PayoffNode(); 
       T.Category = "Account==" + K; 
       T.GreekType = "Greek==" + K; 
       T.DealNo = K; 
       T.Strategy = "Strategy==" + K; 
       for (int DP = 1; DP <= 21; DP++) 
       { 
        T.Data[DP] = Rnd.Next(10, 99); 
       } 
       PayLL.AddLast(T); 
      } 

List<Globals.PayoffNode> qP = (from P in PayLL 
              where P.Category == "Account==4" && P.DealNo == 4 && P.GreekType == "Greek==4" && P.Strategy == "Strategy==4" 
              select new Globals.PayoffNode() 
              { 
               Category=P.Category, 
               DealNo=P.DealNo, 
               GreekType=P.GreekType, 
               Strategy=P.Strategy, 
               Data1=P.Data[1], 
               Data2 = P.Data[2], 
               Data3 = P.Data[3], 
              }).ToList(); 

PayoffTable.DataSource = qP; 
+1

'return Data;' это вызывает бесконечную рекурсию. – Slai

+0

Что вы ожидаете, если привяжете массив к столбцу datagridview? – Slai

+0

Я надеюсь увидеть, что каждая запись в datagridview выглядит так: '' Category-GreekType-DealNo-Strategy-Data [1] -Data [2] ... '' Итак, все переменные, а затем массив – Zeus

ответ

1

Один из способов избежать 21 свойств данных является преобразование списка в DataTable:

class PayoffNode 
{ 
    public int DealNo; 
    public string Category; 
    public double[] Data; // = new double[21]; 
} 

, а затем

Random Rnd = new Random(); 

List<PayoffNode> PayLL = Enumerable.Range(1, 10).Select(i => new PayoffNode { 
    DealNo = i, 
    Category = "Account==" + i, 
    Data = Enumerable.Range(1, 21).Select(d => (double)Rnd.Next(10, 99)).ToArray() 
}).ToList(); 

// List<PayoffNode> to DataTable 
var dt = new DataTable(); 
dt.Columns.Add("DealNo", typeof(int)); 
dt.Columns.Add("Category"); // typeof(string) by default 
for (int i = 1; i <= 21; i++) 
    dt.Columns.Add("Data" + i, typeof(double)); 

foreach (var P in PayLL) 
{ 
    var dr = dt.Rows.Add(P.DealNo, P.Category); 
    for (int i = 0; i < 21; i++) 
     dr[i+2] = P.Data[i]; // +2 is the number of fields before the Data fields 
} 

PayoffTable.DataSource = dt; 
dt.DefaultView.RowFilter = " Category = 'Account==4' "; 

Преимущество в том, что вы установили DataSource только один раз и просто измените RowFilter, чтобы отфильтровать его. Кроме того, любые изменения, внесенные в DataGridView, меняют DataTable и наоборот.

Обратите внимание, что массивы в C# и большинстве других языков начинаются с 0, а не с 1 (.Data[0] для доступа к первому элементу массива), поэтому цикл for для доступа к массиву данных в моем примере составляет от 0 до 20.

+0

Спасибо, это выглядит намного больше эффективный. Я просто предпочитаю использовать базовые массивы 1. – Zeus

0
public double[] Data 
{ 
    get { return Data; } 
    set { Data = value; } 
} 

Это проблема, объект в наборе и получить метод должен обратиться к другому объекту в противном случае, когда значение объекта устанавливаются или пытается быть извлечено он просто будет продолжать называть эти методы бесконечно , должно быть ...

private double[] _data; 
public double[] Data 
{ 
    get { return _data; } 
    set { _data = value; } 
} 

или ...

public double[] Data { get; set; } 
+0

Согласен, но ваш ответ не работает. Я получаю сообщение об ошибке в строке '' T.Data [DP] = Rnd.Next (10, 99); '' say '' Ссылка на объект не установлена ​​в экземпляр объекта. '' – Zeus

Смежные вопросы