2016-10-23 14 views
0

リンクリストをデータグリッドビューにバインドしようとしています。以下のメソッドは、配列を除くクラスのプロパティに対して機能します。 配列を新しいインスタンスとして宣言すると、linkedlistは正しく作成されますが、配列はdatagridviewにバインドされません。 配列がプロパティとして作成されている場合(コードが正しいと思います)、linkedlistが作成されるとAn unhandled exception of type 'System.StackOverflowException' occurredとなります。リンクリストをデータグリッドビューにバインドする

ありがとうございました。

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

一つの方法は、データテーブルにリストを変換することです:

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' "; 

利点は、0を設定することですを一度だけ変更し、RowFilterを変更してフィルタリングしてください。また、DataGridViewで行われた変更によってDataTableが変更され、その逆もあります。

C#およびその他のほとんどの言語の配列は0から始まって1から始まらず(配列の最初の項目にアクセスするには.Data[0])、私の例ではforループがデータ配列にアクセスすることに注意してください。

+0

ありがとうございます効率的。私はちょうどベース1の配列を使用することを好む。 – Zeus

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

オブジェクト値を設定または取得することを試みている時はいつでもこれは、セット内のオブジェクトの問題であり、この方法は、別のオブジェクトを参照する必要があり得るそれ以外の場合は、単に無限にこれらのメソッドを呼び出す続けます。でなければなりません... 21のデータプロパティを避けるために

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); ''オブジェクト参照がオブジェクトのインスタンスに設定されていません。 'というエラーが表示されます。 – Zeus

関連する問題