【问题标题】:C# Datatable Grid CalculationC# 数据表网格计算
【发布时间】:2013-02-25 10:07:56
【问题描述】:

我一直在尝试在 C# Winform DataTable 中构建一个简单的网格计算,其中用户输入起始值、结束值、展开起始值和展开结束值(在下面的代码中,我只是硬编码了这些值)。从那里,该表构建了一个计算值矩阵。

例如(初始结构):

价格 A B C D

1
2
3
4

计算值:

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();
    }

【问题讨论】:

  • 这里似乎没有问题。
  • 当您说想要更好的解决方案时,您到底在寻找什么?
  • @Matt - 我构建它的方式是使用表达式。我想有比这更快更好的编码解决方案。也许多维数组是更好的解决方案。

标签: c# matrix datatable


【解决方案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 更有效。

【讨论】:

  • 是的,这是一个比我之前的代码更好的解决方案。但是,这会将静态值/名称(例如“Value4”)返回到列,而不是动态值/名称。感谢您的帮助!
  • 不客气。对于列名,您可以使用 [DisplayName] 属性。见这里:stackoverflow.com/questions/5551418/…
  • 哦,我刚刚意识到您想要动态的.. 在这种情况下,您还可以通过编程方式更改 DataGridView 列名。示例:dataGridView1.Columns[2].Name = "My Column Name";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2013-08-01
  • 2012-07-03
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多