【发布时间】:2016-08-05 15:18:42
【问题描述】:
我有一个 gridview,它从 SQL Server 2014 的数据库中获取数据。gridview 有四列来自数据库 (p_id, p_image, p_name, p_price),后面是 2 个附加列,一个下拉列表和一个复选框,下面有一个文本框网格视图。
我的要求是当我选中复选框时,所选行的价格列中的值与下拉列表控件中的值相乘并显示在文本框中。
当我再次选中另一个复选框时,我希望将此选定行的价格列的值与其下拉列表值相乘,并添加到文本框的前一个值并显示在同一个文本框中。我使用的代码是:
public double sum = 0 ;
protected void chkSelect_CheckedChanged(object sender, EventArgs e)
{
foreach (GridViewRow row in gvPackaged.Rows)
{
CheckBox chk = (row.Cells[5].FindControl("chkSelect") as CheckBox);
DropDownList ddl = (row.Cells[4].FindControl("ddlSelect") as DropDownList);
if (row != null && chk != null)
{
if (chk.Checked)
{
double quantity = Convert.ToDouble(ddl.Text);
double price = Convert.ToDouble(row.Cells[3].Text);
sum += (price * quantity);
tbTotal.Text = Convert.ToString(sum);
}
}
}
}
代码正在运行,但问题是每次我选中复选框时,都会调用 onCheckedChanged 方法,它会遍历 gridview 中的所有行,然后在文本框中显示值,这使得过程相当缓慢.
我在包括这个论坛在内的许多论坛中进行了搜索,发现几乎每个问题和答案都使用了这种方法。
唯一的其他方法是:
GridViewRow row = myGridview.SelectedRow;
而不是
foreach (GridViewRow row in myGridview.Rows)
因此我在我的代码中使用了它:
public double sum = 0 ;
protected void chkSelect_CheckedChanged(object sender, EventArgs e)
{
GridViewRow row = gvPackaged.SelectedRow;
CheckBox chk = (row.Cells[5].FindControl("chkSelect") as CheckBox); //HERE
DropDownList ddl = (row.Cells[4].FindControl("ddlSelect") as DropDownList);
if (row != null && chk != null)
{
if (chk.Checked)
{
double quantity = Convert.ToDouble(ddl.Text);
double price = Convert.ToDouble(row.Cells[3].Text);
sum += (price * quantity);
tbTotal.Text = Convert.ToString(sum);
}
}
}
然后在//HERE这一行上面的代码中出现了这个错误:
NullReferenceException
这意味着上面一行中的行变量发生了异常,并且
对象引用未设置为对象的实例。
我再次搜索它,发现它是一个普遍的例外,并没有找到特定于我的问题的解决方案。
任何人都可以帮助我将当前选定的行检索到row 变量中,以便我可以直接使用该行执行计算,而无需使用循环和迭代。
【问题讨论】:
-
sender参数是CheckBox,因此您不必尝试查找它,而是使用CheckBox chk = (CheckBox)sender;。它的父控件是GridViewRow,因此您应该能够使用它来查找DropDownList并仅针对该行执行计算而无需迭代。
标签: c# asp.net gridview checkbox nullreferenceexception