如何从数据表计算所有行中特定的[Math.pow]列

时间:2019-11-25 03:18:33

标签: c# datatable

我正在尝试计算特定列的数字(Math.pow)的幂。 这是我的代码:

public void showData()
    {
       //query code//
       int i = 0;
       int[] sum = new int[101];
       for (i = 1; i < 101; i++)
       {
           double Avg;
           int indexOfcolumn;
           sum[i] = Convert.ToInt32(dt.Compute("Sum(BIN" + i.ToString() + ")", string.Empty));
           if (sum[i] == 0)
           {
               dt.Columns.Remove("BIN" + i.ToString() + "");
           }
           else{
               dt.Columns.Add("%BIN" + i.ToString() + "", typeof(double), "(BIN" + i.ToString() + " / [In System])*100 ");
               indexOfcolumn = dt.Columns.IndexOf("%BIN" + i.ToString() + "");
               if (i == 1)
               {
                    double value = 0;
                    double pow = 0;
                    for (int p = 0; p < dt.Rows.Count - 1; p++)
                    {
                        int d = dt.Columns.IndexOf("_100BIN1");
                        value = Convert.ToDouble(dt.Rows[p][indexOfcolumn].ToString());
                        pow = Math.Pow(value,-0.5);   
                    }
                    dt.Columns.Add("test", typeof(double), pow.ToString());         
               }
          }
     }

我的代码中的问题:

double value = 0;
double pow = 0;
for (int p = 0; p < dt.Rows.Count - 1; p++)
{
   int d = dt.Columns.IndexOf("_100BIN1");
   value = Convert.ToDouble(dt.Rows[p][indexOfcolumn].ToString());
   pow = Math.Pow(value,-0.5);   
}
dt.Columns.Add("test", typeof(double), pow.ToString());

在列名“ test”中,从loop获取值。它在dataGridView中仅显示一个值

更新我的代码:

dt.Columns.Add("test", typeof(double));
dt.RowChanged += new DataRowChangeEventHandler(TableRowChanged);

这:

private static void TableRowChanged(object sender, DataRowChangeEventArgs e)
{
   e.Row.Table.RowChanged -= new DataRowChangeEventHandler(TableRowChanged);
   e.Row["test"] = Math.Pow(Convert.ToInt32(e.Row["_100BIN1"]),Convert.ToInt32(-0.5));
   e.Row.Table.RowChanged += new DataRowChangeEventHandler(TableRowChanged);        
}

1 个答案:

答案 0 :(得分:0)

我相信Column.Expression有一些限制。但是您可以使用var利用RowChanged事件来实现此目的。例如,

var dataTable = new DataTable();
dataTable.Columns.Add("One");
dataTable.Columns.Add("Two");
dataTable.Columns.Add("Pow");//
dataTable.RowChanged += new DataRowChangeEventHandler(TableRowChanged);

TableRowChanged定义为

private static void TableRowChanged(object sender, DataRowChangeEventArgs e)
{
    e.Row.Table.RowChanged -= new DataRowChangeEventHandler(TableRowChanged);
    e.Row["Pow"]= Math.Pow(Convert.ToInt32(e.Row["One"]),Convert.ToInt32(e.Row["Two"]));
    e.Row.Table.RowChanged += new DataRowChangeEventHandler(TableRowChanged);
}

请确保在计算之前取消预订RowChanged事件,然后再次添加回该事件,如上面的示例所示。

Demo Code