如何在做计算前检查DataGridView中的行是否包含“0”或为空,并删除该行
How to check if row contains "0" or is empty in DataGridView before doing calculations, and delete this row
伙计们!
我的代码需要一些帮助。
所以,故事是,我有一个任务是做一个表单应用程序,用户可以在其中计算离散随机变量的熵。他键入事件和概率,程序计算熵。
所以我使用了DataGridView、一个按钮和一个TextBox。我什么都做了,包括限制,比如"sum of all probabilities must be equal to 1"。
但我不能做的是 - 程序本身必须删除或忽略包含“0”的行或空行(因为熵公式包含数字的对数和 0 的对数是无穷大,这就是为什么程序会输出 "NaN - not a number")。
主要代码位于"button".
这是它的一个片段:
for (int z = dataGridView1.Rows.Count - 1; z >= 0; z--)
{
if (dataGridView1[1, z].Value == null)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[z]);
}
else if (dataGridView1[1, z].Value == "0")
{ dataGridView1.Rows.Remove(dataGridView1.Rows[z]);}
}
我在这段代码之后得到的唯一结果是一条错误消息,说它无法删除新的 "transmitted"(不知道如何将其翻译成英文)行。
这是完整的代码,位于 "button":
int counter = 1;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
dataGridView1[0, i].Value = counter++;
}
double X = 0;
double A = 1;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
X += Convert.ToDouble(dataGridView1[1, i].Value);
}
if (X < A && X > A)
{
MessageBox.Show("Cумма вероятностей меньше или больше 1, введите другие значения вероятностей", "АШИППКА", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
double H = 0;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
for (int z = dataGridView1.Rows.Count - 1; z >= 0; z--)
{
if (dataGridView1[1, z].Value == null)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[z]);
}
else if (dataGridView1[1, z].Value == "0")
{ dataGridView1.Rows.Remove(dataGridView1.Rows[z]);}
}
double p = Convert.ToDouble(dataGridView1[1, i].Value);
H += p * Math.Log(p, 2.0);
}
textBox1.Text = Convert.ToString(-H);
}
抱歉我的英语不好,这不是我的母语,所以有很多错误。有什么不明白的请追问。
请帮帮我。
详细说明以上评论。
如果您的 DataGridView
使用 DataTable
或 BindingSource
,例如
DataTable table = new DataTable();
table.Columns.Add(...);
DataGridView dgv = new DataGridView();
dgv.DataSource = table;
循环引用 dataGridView1
的任何地方,将其替换为 table
。
例如
for (int i = 0; i < table.Rows.Count; i++) {
//...
}
伙计们! 我的代码需要一些帮助。
所以,故事是,我有一个任务是做一个表单应用程序,用户可以在其中计算离散随机变量的熵。他键入事件和概率,程序计算熵。
所以我使用了DataGridView、一个按钮和一个TextBox。我什么都做了,包括限制,比如"sum of all probabilities must be equal to 1"。
但我不能做的是 - 程序本身必须删除或忽略包含“0”的行或空行(因为熵公式包含数字的对数和 0 的对数是无穷大,这就是为什么程序会输出 "NaN - not a number")。 主要代码位于"button".
这是它的一个片段:
for (int z = dataGridView1.Rows.Count - 1; z >= 0; z--)
{
if (dataGridView1[1, z].Value == null)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[z]);
}
else if (dataGridView1[1, z].Value == "0")
{ dataGridView1.Rows.Remove(dataGridView1.Rows[z]);}
}
我在这段代码之后得到的唯一结果是一条错误消息,说它无法删除新的 "transmitted"(不知道如何将其翻译成英文)行。
这是完整的代码,位于 "button":
int counter = 1;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
dataGridView1[0, i].Value = counter++;
}
double X = 0;
double A = 1;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
X += Convert.ToDouble(dataGridView1[1, i].Value);
}
if (X < A && X > A)
{
MessageBox.Show("Cумма вероятностей меньше или больше 1, введите другие значения вероятностей", "АШИППКА", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
double H = 0;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
for (int z = dataGridView1.Rows.Count - 1; z >= 0; z--)
{
if (dataGridView1[1, z].Value == null)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[z]);
}
else if (dataGridView1[1, z].Value == "0")
{ dataGridView1.Rows.Remove(dataGridView1.Rows[z]);}
}
double p = Convert.ToDouble(dataGridView1[1, i].Value);
H += p * Math.Log(p, 2.0);
}
textBox1.Text = Convert.ToString(-H);
}
抱歉我的英语不好,这不是我的母语,所以有很多错误。有什么不明白的请追问。
请帮帮我。
详细说明以上评论。
如果您的 DataGridView
使用 DataTable
或 BindingSource
,例如
DataTable table = new DataTable();
table.Columns.Add(...);
DataGridView dgv = new DataGridView();
dgv.DataSource = table;
循环引用 dataGridView1
的任何地方,将其替换为 table
。
例如
for (int i = 0; i < table.Rows.Count; i++) {
//...
}