2013-03-10 28 views
0

我一直在試圖建立一個簡單的網格計算在C#Winform DataTable中,用戶輸入起始值,結束值,傳播起始值和傳播結束值(在下面的代碼中,我只是硬編碼值)。從那裏,表格建立一個計算值的矩陣。C#數據表網格計算

例如(初始結構):

價格ABCD

計算值:

1 - A,1 - B, 1-C,1-D, 2-A,2-B,2-C,2-D, 3-A,3- B,3 - C,3 - D, 4 - A,4 - B,4 - C,4 - D,

下面的網格是我第一次嘗試建立一個計算網格 - 這將是一個更好的解決方案這比下面?:

static DataTable GetCalcGrid() 
     { 

      DataTable table = new DataTable(); 
      table.Clear(); 
      DataColumn column; 
      DataRow row; 

      try 
      { 
       //double minValue = (double)startingPrice.Value; 
       double minValue = 1; 
       //double maxValue = (double)endingPrice.Value; 
       double maxValue = 2; 
       //double incrementValue = (double)incrementPrice.Value; 
       double incrementValue = .25; 

       //double minSpreadValue = (double)spreadRangeLow.Value; 
       double minSpreadValue = -.50; 
       //double maxSpreadValue = (double)spreadRangeHigh.Value; 
       double maxSpreadValue = .50; 
       //double incrementSpreadValue = (double)spreadIncrement.Value; 
       double incrementSpreadValue = .25; 

       column = new DataColumn(); 
       column.DataType = System.Type.GetType("System.Int32"); 
       column.ColumnName = "N*"; 
       column.AutoIncrement = true; 
       column.AutoIncrementSeed = 1; 
       column.AutoIncrementStep = 1; 
       table.Columns.Add(column); 

       column = new DataColumn(); 
       column.DataType = System.Type.GetType("System.Double"); 
       column.ColumnName = "Price"; 
       table.Columns.Add(column); 

       for (double x = minSpreadValue; x < maxSpreadValue + incrementSpreadValue; x += incrementSpreadValue) 
       { 
        double value; 
        value = x; 

        column = new DataColumn(); 
        column.DataType = System.Type.GetType("System.Double"); 
        column.ColumnName = value.ToString("0.000"); 
        table.Columns.Add(column); 
        table.Columns[value.ToString("0.000")].Expression = "(([Price] + (" + value + ")))"; 
        //table.Columns[value.ToString("0.000")].Expression = " " + OP.black("C",4,Convert.ToDouble("(([Price] + (" + value + ")))"),.32,15,365,.003,1).ToString() + " "; 
       } 

       for (double i = minValue; i < maxValue + incrementValue; i += incrementValue) 
       { 
        row = table.NewRow(); 
        row["Price"] = i; 
        table.Rows.Add(row); 
       } 

      } 
      catch (Exception ex) { MessageBox.Show("! " + ex); } 
      finally { } 

      return table; 
     } 

    private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = GetCalcGrid(); 
    } 
+0

這裏似乎沒有問題。 – 2013-03-10 02:17:17

+0

當你說你想要更好的解決方案時,你到底在尋找什麼? – Matt 2013-03-10 02:26:48

+0

@Matt - 我建立這個的方式是使用表達式。我會想象有一個比這更快,更好的編碼解決方案。也許多維數組是更好的解決方案。 – JAS 2013-03-10 02:31:43

回答

1

你可以嘗試這樣的事:

public class Matrix : List<MatrixEntry> 
    { 
    } 

    public class MatrixEntry 
    { 
     public double Price { get; private set; } 

     public double Value1 
     { 
      get { return (Price - 0.5); } 
     } 

     public double Value2 
     { 
      get { return (Price - 0.25); } 
     } 

     public double Value3 
     { 
      get { return Price; } 
     } 

     public double Value4 
     { 
      get { return (Price + 0.25); } 
     } 

     public double Value5 
     { 
      get { return (Price + 0.5); } 
     } 

     public MatrixEntry(double price) 
     { 
      Price = price; 
     } 
    } 

static Matrix GetMatrixCalcGrid() 
     { 
      var matrix = new Matrix(); 

      try 
      { 
       double minValue = 1; 
       double maxValue = 2; 
       double incrementValue = .25; 

       for (double i = minValue; i < maxValue + incrementValue; i += incrementValue) 
       { 
        var entry = new MatrixEntry(i); 
        matrix.Add(entry); 
       } 

      } 
      catch (Exception ex) { Console.WriteLine("! " + ex); } 
      finally { } 

      return matrix; 
     } 

這是你在找什麼?

注:我明明硬編碼的計算..但你可以添加一些額外的屬性來存儲用戶輸入和修改屬性返回正確的值。我的例子的主要觀點是,我認爲它比使用DataTable更有效。

+0

是的,這是比我以前的代碼更好的解決方案。但是,這會向列返回一個靜態值/名稱(例如'Value4'),而不是動態值/名稱。感謝幫助! – JAS 2013-03-10 15:54:49

+0

不客氣。對於列名稱,可以使用[DisplayName]屬性。看到這裏:http://stackoverflow.com/questions/5551418/how-do-i-set-columnnames-for-a-datagridview-bound-to-a-listt – Matt 2013-03-11 00:56:55

+0

哦,我剛剛意識到你想動態..在那情況下,您還可以編程方式更改DataGridView列名稱。例如:'dataGridView1.Columns [2] .Name =「我的列名」;' – Matt 2013-03-11 00:58:03