我有一个DataGridView
,其中有列项目,描述,数量,费率&总。
我有两种类型的物品,一种物品有vapasi ==是(vapasi是一种存储量),&另一个项目有vapasi ==否。我想通过用vapasi和amp;来区分项目来计算'总'列的总和。没有vapasi的物品,&想要将这个计算出的总数显示在两个相应的文本框中,即'txtboxwithvapasi',n'txtboxwithoutvapasi',它们位于网格之后。我做了以下代码:
private void grdPurchase_CellEndEdit_1(object sender, DataGridViewCellEventArgs e)
{
try
{
try
{
string value = grdPurchase.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
if (e.ColumnIndex == 2)
{
int val = int.Parse(value);
quantity = val;
}
if (e.ColumnIndex == 4)
{
float val = float.Parse(value);
total = val;
if (vapasi1 == "Yes")
{
vtot += total; //vtot=0+10
txt_forvapasitotal.Text = vtot.ToString(); //10
float vapsitot =float.Parse(txt_forvapasitotal.Text);
float vapsicalculate = (vapsitot * a);
float tax = vapsicalculate / 100;
float with_vapasi = vtot + tax;
txt_withvapasi.Text =Convert.ToString(with_vapasi);
}
else
{
nvtot = 0;
for (int i = 0; i < grdPurchase.Rows.Count; i++)
{
if (vapasi1 == "No")
{
if (grdPurchase.Rows[e.RowIndex].Cells[3].Selected == true)
{
nvtot += float.Parse(grdPurchase[4, i].EditedFormattedValue.ToString());
txt_withoutvapasitot.Text = nvtot.ToString();
}
}
}
}
txt_vapasiincludedtot.Text =(float.Parse(txt_withvapasi.Text) +float.Parse(txt_withoutvapasitot.Text)).ToString();
}
if (e.ColumnIndex == 1)
{
int val = int.Parse(value);
materialid = val;
string vapasi = "Select material_vapasi from tbl_material_master where active_flag=1 AND material_id =" + materialid + "";
SqlCommand cmd = new SqlCommand(vapasi, con);
sdr = cmd.ExecuteReader();
if (sdr.HasRows)
{
while (sdr.Read())
{
vapasi1 = sdr["material_vapasi"].ToString();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
grdPurchase.Columns[3].ReadOnly = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
问题是: - 当我在第一行选择带有vapasi的项目时在没有vapasi的第二行项目中,它正常工作。但是如果我选择第三行中的任何项目,那么它在“txtboxwithoutvapasi”中的所有三个项目的总和而不区分项目。
答案 0 :(得分:0)
您需要为网格中的每一行跟踪 vapasi 为“是”或“否”,但您使用的是单个变量。无法将此列添加到网格中(如果您不想向用户显示此列,则为隐藏列)?然后,无论何时需要计算总数,您只需遍历网格行并检查 vapasi列,而不是 vapasi1变量。