2013-03-10 2 views
0

Я пытаюсь построить простой подсчет сетки в C# Winform DataTable, где пользователь вводит начальное значение, конечное значение, начальное значение распространения и значение окончания распространения (в приведенном ниже коде я просто жестко закодировал значения). Оттуда в таблице построена матрица вычисленных значений.C# Datatable Grid Calculation

Например (исходная структура):

Цена ABCD

Рассчитанные значения:

1 -, 1 - Б, 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

Здесь, похоже, нет вопроса. –

+0

Что именно вы ищете, когда говорите, что хотите получить лучшее решение? – Matt

+0

@Matt - путь, который я создал, это использование выражений. Я бы предположил, что есть более быстрое и лучшее решение для кодирования, чем это. Может быть, многомерные массивы - лучшее решение. – JAS

ответ

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

+0

Добро пожаловать. Для имен столбцов вы можете использовать атрибут [DisplayName]. См. Здесь: http://stackoverflow.com/questions/5551418/how-do-i-set-columnnames-for-a-datagridview-bound-to-a-listt – Matt

+0

О, я просто понял, что вы хотите динамического .. в этом case, вы также можете изменить имена столбцов DataGridView программно. Пример: 'dataGridView1.Columns [2] .Name =" My Column Name ";' – Matt