none
ListView的OnItemCommand事件,怎么获得SelectedItemTemplate里的Label值 RRS feed

  • 问题

  • 事件如下:

    protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (String.Equals(e.CommandName, "Cpby"))
            {
                ListViewDataItem dataItem = (ListViewDataItem)e.Item;
                Label Mylabel;
                DataRow Myrow = Cpdt.NewRow();//存储购物车新行对象
                Mylabel = (Label)e.Item.FindControl("CPIDLabel");//商品编号
                Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);
                Mylabel = (Label)e.Item.FindControl("CPNAMELabel");//商品名称
                Myrow["CPNAME"] = Mylabel.Text;
                Mylabel = (Label)e.Item.FindControl("CPDJLabel");//单价
                Myrow["CPDJ"] = Convert.ToDouble(Mylabel.Text);
                Myrow["SL"] = 1;//商品数量
                Myrow["CPSUM"] = Myrow["CPDJ"];//总计
                Cpdt.Rows.Add(Myrow);
                Response.Redirect("probuycar.aspx");
            }
        }

    错误提示:Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);

    未将对象引用设置到对象的实例

    注意:.net3.5版本的写法是怎么样的.麻烦解决一下.谢了.


    • 已编辑 阿波 2012年5月11日 14:23
    2012年5月10日 9:03

答案

  • 终于找到原因了.这个事件它去获取的是ItemTemplate标签里面的ID为"CPIDLabel"的值,我正好把这个ID给删除了.得不到值.

    <ItemTemplate><asp:Label ID="CPIDLabel" runat="server" Text='<%# Eval("CPID") %>' 
                            Visible="False" />
    </ItemTemplate>

    好像ListView控件还要取<AlternatingItemTemplate>标签里面的里面的ID为"CPIDLabel"的值嘛.
    <AlternatingItemTemplate><asp:Label ID="CPIDLabel" runat="server" Text='<%# Eval("CPID") %>' 
                            Visible="False" />
    </ItemAlternatingItemTemplate

    经验啊,教训啊.
    • 已标记为答案 阿波 2012年5月11日 14:29
    • 已编辑 阿波 2012年5月11日 15:27
    2012年5月11日 14:27

全部回复

  • 您好,请问您的CPIDLabel有包在其他的控制项之内吗?
    请参考 ListView OnItemCommand e.Item.FindControl strange behaviour

    或是使用 Recursive FindControl<T>


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年5月11日 2:06
  • 没有,它在SelectedItemTemplate下面.

    为什么一模一样的代码,在另一个网站上完全可以执行,到我这个网站却不能执行呢.很奇怪呢.

    <SelectedItemTemplate>
                        <td id="Td6" runat="server" style="">
                            CPID:
                            <asp:Label ID="CPIDLabel" runat="server" Text='<%# Eval("CPID") %>' />
                            <br />
                            CPNAME:
                            <asp:Label ID="CPNAMELabel" runat="server" Text='<%# Eval("CPNAME") %>' />
                            <br />
                            CPDJ:
                            <asp:Label ID="CPDJLabel" runat="server" Text='<%# Eval("CPDJ") %>' />
                            <br />
                            BIMG:
                            <asp:Label ID="BIMGLabel" runat="server" Text='<%# Eval("BIMG") %>' />
                            <br />
                        </td>
                    </SelectedItemTemplate>

    • 已标记为答案 阿波 2012年5月11日 14:29
    • 取消答案标记 阿波 2012年5月11日 14:29
    2012年5月11日 2:11
  • 看起来是Cpdt没有这个CPID字段

    你的Cpdt 是怎么来的?

     


    2012年5月11日 3:35
  • public static DataTable Cpdt;

    一样的代码,在另一个网站里完全没问题的,怎么到这个网站里就这样了啊.实在找不到原因啊.
    2012年5月11日 6:24
  • 事件如下:

    protected void ListView1_OnItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (String.Equals(e.CommandName, "Cpby"))
            {
                ListViewDataItem dataItem = (ListViewDataItem)e.Item;
                Label Mylabel;
                DataRow Myrow = Cpdt.NewRow();//存储购物车新行对象
                Mylabel = (Label)e.Item.FindControl("CPIDLabel");//商品编号
                Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);
                Mylabel = (Label)e.Item.FindControl("CPNAMELabel");//商品名称
                Myrow["CPNAME"] = Mylabel.Text;
                Mylabel = (Label)e.Item.FindControl("CPDJLabel");//单价
                Myrow["CPDJ"] = Convert.ToDouble(Mylabel.Text);
                Myrow["SL"] = 1;//商品数量
                Myrow["CPSUM"] = Myrow["CPDJ"];//总计
                Cpdt.Rows.Add(Myrow);
                Response.Redirect("probuycar.aspx");
            }
        }

    错误提示:Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);

    未将对象引用设置到对象的实例

    注意:.net3.5版本的写法是怎么样的.麻烦解决一下.谢了.

    尝试这样做(你在我的if这一句设断点看看究竟if执行了没有,没有表示Cpdt或者Mylable转换有问题):

       ListViewDataItem dataItem = (ListViewDataItem)e.Item;
                Label Mylabel;
                DataRow Myrow = Cpdt.NewRow();//存储购物车新行对象
                Mylabel = (Label)e.Item.FindControl("CPIDLabel");//商品编号
                 if(Cpdt.Columns.Count>0 && Mylabel!=null)
                 {
     
                Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);

                 }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月11日 6:32
    版主
  • 一样的代码,我另新建了一个文件,现在完全好了,现在我在找原因,难道是我之前的页面是另存页面的原因?但另存的话,代码也是另存的啊.

    2012年5月11日 6:47
  • 确认一下 页面使用的Class名称是不是一样的

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    public partial class _Default : System.Web.UI.Page



    2012年5月11日 6:58
  • 老是出现这种错误: 

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    源错误:

    行 44:             DataRow Myrow = Cpdt.NewRow();//存储购物车新行对象
    行 45:             Mylabel = (Label)e.Item.FindControl("CPIDLabel");
    行 46:             Myrow["CPID"] = Convert.ToInt32(Mylabel.Text);
    

    2012年5月11日 7:48
  • 终于找到原因了.这个事件它去获取的是ItemTemplate标签里面的ID为"CPIDLabel"的值,我正好把这个ID给删除了.得不到值.

    <ItemTemplate><asp:Label ID="CPIDLabel" runat="server" Text='<%# Eval("CPID") %>' 
                            Visible="False" />
    </ItemTemplate>

    好像ListView控件还要取<AlternatingItemTemplate>标签里面的里面的ID为"CPIDLabel"的值嘛.
    <AlternatingItemTemplate><asp:Label ID="CPIDLabel" runat="server" Text='<%# Eval("CPID") %>' 
                            Visible="False" />
    </ItemAlternatingItemTemplate

    经验啊,教训啊.
    • 已标记为答案 阿波 2012年5月11日 14:29
    • 已编辑 阿波 2012年5月11日 15:27
    2012年5月11日 14:27