我正在尝试计算特定列的数字(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);
}
答案 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事件,然后再次添加回该事件,如上面的示例所示。