2016-10-23 2 views
0

linkedlist를 datagridview에 바인드하려고합니다. 아래의 메소드는 배열을 제외한 클래스의 속성에 대해 작동합니다. 배열을 새 인스턴스로 선언하면 linkedlist가 제대로 작성되지만 배열은 DataGridview에 바인딩되지 않습니다. 배열이 속성으로 생성 된 경우 (코드가 올바른 것 같음) 연결 목록을 만들면 An unhandled exception of type 'System.StackOverflowException' occurred이됩니다.linkedlist를 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; 

업데이트 : 코멘트에 대한 덕분에,이 일 것으로 보인다.

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

한 가지 방법 ... ...

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

또는를해야하는 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으로 변경되며 그 반대의 경우도 마찬가지입니다.

배열의 첫 번째 항목에 액세스하려면 .Data[0]이 0이 아니라 다른 언어로 시작된다는 점에 유의하십시오. 따라서이 예에서 데이터 배열에 액세스하는 for 루프는 0에서 20 사이입니다.

+0

감사합니다. 실력 있는. 난 그냥 기본 1 배열을 사용하는 것을 선호합니다. – Zeus

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

이 문제, 세트의 객체이며, 취득 방법은 개체 값을 그냥 무한 이러한 메서드를 호출 계속됩니다 검색 할 설정하거나 시도하고, 그렇지 않으면 때마다 다른 객체를 참조 할 필요가 . 21 개 데이터의 특성을 피하기 위해

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

동의하지만 답변이 작동하지 않습니다. T.Data [DP] = Rnd.Next (10, 99);''객체 참조가 객체의 인스턴스로 설정되지 않았습니다 '라고 말하면 오류가 발생합니다. – Zeus

관련 문제