C# 从代码隐藏访问ListView评估。获取未设置为对象实例的对象引用

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

像许多其他人一样,我正在尝试为ListView之外的表中的标签指定一个Eval值。我使用的是一个存储过程,它返回全市各地站点的每月降雨量。我想要的字段不是传递的参数之一:@reqyear和@reqLocation。它是一个计算字段,Total,在ListView中显示为Eval,但我不知道如何在代码隐藏中直接访问它,所以我使用ItemDataBound方法查找控件,然后分配它。在木板上很容易找到几只鹬。所以我尝试了每一个似乎适用的方法,都返回了一个“对象引用未设置为对象实例”错误。我正在尝试将Eval(“Total”)分配给标签id MTotal。页面运行正常,没有标签分配所需的代码。也许,我使用错误的方式分配标签,并且可以在不使用ListView中的Eval的情况下获得所需的字段

任何建议都将不胜感激

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;