C# 从代码隐藏访问ListView评估。获取未设置为对象实例的对象引用
像许多其他人一样,我正在尝试为ListView之外的表中的标签指定一个Eval值。我使用的是一个存储过程,它返回全市各地站点的每月降雨量。我想要的字段不是传递的参数之一:@reqyear和@reqLocation。它是一个计算字段,Total,在ListView中显示为Eval,但我不知道如何在代码隐藏中直接访问它,所以我使用ItemDataBound方法查找控件,然后分配它。在木板上很容易找到几只鹬。所以我尝试了每一个似乎适用的方法,都返回了一个“对象引用未设置为对象实例”错误。我正在尝试将Eval(“Total”)分配给标签id MTotal。页面运行正常,没有标签分配所需的代码。也许,我使用错误的方式分配标签,并且可以在不使用ListView中的Eval的情况下获得所需的字段 任何建议都将不胜感激C# 从代码隐藏访问ListView评估。获取未设置为对象实例的对象引用,c#,asp.net,listview,stored-procedures,eval,C#,Asp.net,Listview,Stored Procedures,Eval,像许多其他人一样,我正在尝试为ListView之外的表中的标签指定一个Eval值。我使用的是一个存储过程,它返回全市各地站点的每月降雨量。我想要的字段不是传递的参数之一:@reqyear和@reqLocation。它是一个计算字段,Total,在ListView中显示为Eval,但我不知道如何在代码隐藏中直接访问它,所以我使用ItemDataBound方法查找控件,然后分配它。在木板上很容易找到几只鹬。所以我尝试了每一个似乎适用的方法,都返回了一个“对象引用未设置为对象实例”错误。我正在尝试将E
code behind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;
namespace WebApplication1.OUTREACH.rainfall
{
public partial class monthlyRF : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
reqyear.Items.Clear();
for (int i = DateTime.Now.Year; i != 1998; i--)
{
reqyear.Items.Add(i.ToString());
}
reqLocation.SelectedValue = "2";
}
String strConnString = WebConfigurationManager.ConnectionStrings["TelogerConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "dbo.spBWSC_GetTrendDataMonthly";
cmd.Parameters.Add("@req_Location", SqlDbType.VarChar).Value = reqLocation.Text;
cmd.Parameters.Add("@req_year", SqlDbType.VarChar).Value = reqyear.Text;
cmd.Connection = con;
try
{
con.Open();
ListView1.DataSource = cmd.ExecuteReader();
ListView1.DataBind();
yearLabel.Text = reqyear.Text;
switch (cmd.Parameters["@Req_Location"].Value.ToString())
{
case "2":
site_nameLabel.Text = "Union Park";
break;
case "3":
site_nameLabel.Text = "Roslindale";
break;
case "4":
site_nameLabel.Text = "Dorch-Adams";
break;
case "5":
site_nameLabel.Text = "Allston";
break;
case "6":
site_nameLabel.Text = "Charlestown";
break;
case "7":
site_nameLabel.Text = "Longwood";
break;
case "8":
site_nameLabel.Text = "Hyde Park";
break;
case "9":
site_nameLabel.Text = "Dorch-Talbot";
break;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
con.Dispose();
}
}
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
Label Total_lbl;
if (e.Item.ItemType == ListViewItemType.DataItem)
{
Total_lbl = (Label)e.Item.FindControl("Total_lbl");
DataRowView rowView = e.Item.DataItem as DataRowView;
string sTotal = rowView["Total"].ToString();
MTotal.Text = sTotal;
}
}
}
}
ASPX:
联合公园
罗森岱尔
多尔奇·亚当斯
奥尔斯顿
查尔斯顿
长木
海德公园
多尔丘·塔尔博特
没有返回任何数据。
月
降雨量(英寸)
这是listview的页脚
第一单元
我怀疑电话线
DataRowView rowView = e.Item.DataItem as DataRowView;
这就是问题所在。在该行上设置一个断点,并调查您将获得的类型
在使用as关键字进行类型转换的情况下,执行转换失败将返回null而不是异常,因此对[“Total”]索引器的后续调用将在null引用上执行。谢谢。我尝试了你的建议,不幸的是,这行代码从未执行过。它在“掷骰子”时被打破了在catch语句中。对该行进行注释后,返回一行数据,但未分配总数。对,这意味着它上面的try块中的某些内容导致了问题。MSDN文档建议参数名称不区分大小写,因此声明名为'req_Location'的参数,然后使用'req_Location'访问其值这一事实应该无关紧要,尽管这并不理想。将断点放在try块的顶部,并查看引发异常的原因。最后,“throw ex”很少是个好主意,因为它会破坏堆栈跟踪。“扔”就够了。
DataRowView rowView = e.Item.DataItem as DataRowView;