首页 > 解决方案 > 如何计算数据表中所有行中特定的 [Math.pow] 列

问题描述

我正在尝试计算特定列的数字(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”中,从循环中获取值。它在 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);        
}

标签: c#datatable

解决方案


我相信 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 事件并再次添加回来,如上面的示例所示。

演示代码


推荐阅读