none
listview中无法获取listviewdataitem的item RRS feed

  • 问题

  • listview1.items.count一共40行 

    foreach (ListViewDataItem test in listview1.Items)
                    {
                        var a=test.DataItem;//得到的结果为什么是null
                    }

    但是如果在ListView1_ItemDataBound中运行的话就能够正确获取数据

            protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
            {
                ListViewDataItem dataItem = (ListViewDataItem)e.Item;
                var a = dataItem.DataItem;
            }

    那位高人知道为什么

    还有,如何获取listview的列数

    2011年2月18日 1:42

全部回复

  • 您好,估计是代码执行的先后顺序的问题。

    1、在foreach (ListViewDataItem test in listview1.Items)设一个断点

    2、在ListViewDataItem dataItem = (ListViewDataItem)e.Item;设一个断点

    调试一下,应该先执行第2个断点,这样所有数据绑定后,1的代名就应该能获取到数据。

    2011年2月18日 2:48
    版主
  • 您好,试了,不行,得到的还是null

    2011年2月18日 3:02
  • 把相关的关键代码贴出来,越完整越好。
    2011年2月18日 3:51
    版主
  • 问题出在<font style=“color:red”后台代码的倒数第3行

    另外,如何获取ListView的列数,请高手指教?

    前台:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
     <title></title>
    </head>
    <body>
     <form id="form1" runat="server">
     <div>
     <asp:Button ID="btn_Test" Text="测试" runat="server" OnClick="btn_Test_Click" />
     <asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="itemPlaceholder">
      <LayoutTemplate>
      <table cellpadding="3" cellspacing="0" style="border-collapse: collapse;">
       <tr>
       <td>
        姓名
       </td>
       <td>
        部门
       </td>
       </tr>
       <tr id="itemPlaceholder" runat="server">
       </tr>
      </table>
      </LayoutTemplate>
      <ItemTemplate>
      <tr>
       <td>
       <%#Eval("name")%></a>
       </td>
       <td>
       <%#Eval("department")%>
       </td>
      </tr>
      </ItemTemplate>
     </asp:ListView>
     </div>
     </form>
    </body>
    </html>
    
    

    后台

    protected void Page_Load(object sender, EventArgs e)
     {
      if (!IsPostBack)
      {
      bind_ListView1();//ListView绑定测试数据
      }
     }
     //ListView绑定测试数据
     protected void bind_ListView1()
     {
      ListView1.DataSource = get_Table();
      ListView1.DataBind();
     }
     //构建测试数据表
     protected DataTable get_Table()
     {
      System.Data.DataTable dt = new System.Data.DataTable();
      System.Data.DataRow dr;
      dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));
      dt.Columns.Add(new System.Data.DataColumn("Department", typeof(System.String)));
      System.Random rd = new System.Random();
      for (int i = 0; i < 6; i++)
      {
      dr = dt.NewRow();
      dr[0] = System.Math.Ceiling(rd.NextDouble() * 1000);
      dr[1] = DateTime.Now.AddDays(rd.Next(100) - rd.Next(100));
      dt.Rows.Add(dr);
      }
      return dt;
     }
     //问题出在这里!!!!!!!!!
     protected void btn_Test_Click(object sender, EventArgs e)
     {
      string str_Test = string.Empty;
      foreach (ListViewDataItem test in ListView1.Items)
      {
      DataRowView a = (DataRowView)test.DataItem;//其中test.DataItem居然为null,我不知道问什么
      a[0] += str_Test;
      Response.Write(str_Test);
      }
     }
    

     

    2011年2月18日 12:47
  • 你好,请试试看在Page_Load中去掉!IsPostBack。button click的时候触发了一个postback,但是Page_Load的时候只有在不是PostBack的时候才进行DataBind。


    A marked answer is appreciated.
    2011年2月23日 2:38
    版主
  • 将!ispostback去掉后也不行
    2011年2月23日 4:40
  • 你好!

    DataItem 属性只有在事件 ItemDataBound 期间才有用。

     


    知识改变命运,奋斗成就人生!
    2011年2月23日 5:00
    版主
  • 您好,测试后,确实同您所描述的一样。我估计这是因为ListView是个类试Repeator的控件,故无法跨请求传递控件信息。

    估计如肖小勇所述只在绑定时才有效。msdn上也有类试的说法:http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.listviewdataitem.dataitem.aspx

    如果要取数据,建议采用GridView等控件。

    2011年2月23日 12:50
    版主
  • 只能用foreach (ListViewItem test in listview1.Items)这个遍历listview1这个控件下的Items,象你那样(foreach (ListViewDataItem test in listview1.Items)
    )肯定读不出e.item的数据,你只能用foreach (ListViewItem test in listview1.Items)读取这个listview1中的控件的值。

    例如你的ListView改成这样就行了。

     <asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="itemPlaceholder">
     <LayoutTemplate>
     <table cellpadding="3" cellspacing="0" style="border-collapse: collapse;">
      <tr>
      <td>
      姓名
      </td>
      <td>
      部门
      </td>
      </tr>
      <tr id="itemPlaceholder" runat="server">
      </tr>
     </table>
     </LayoutTemplate>
     <ItemTemplate>
     <tr>
      <td>
    <asp:Label ID="LabelName" runat="server" Text='<%# Eval("name") %>'></asp:Label>
      </td>
      <td>
    <asp:Label ID="LabelDepartment" runat="server" Text='<%# Eval("department") %>'></asp:Label>
      </td>
     </tr>
     </ItemTemplate>
     </asp:ListView>
    
    

    然后在cs代码中用以及下方法,就能获取每一个列的内容。

    foreach (ListViewItem test in listview1.Items)
    {
    
    Label LabelName= (Label)test.FindControl("LabelName");
    Label LabelDepartment= (Label)test.FindControl("LabelDepartment");
    
    string Name="";
    string Department="";
    if(LabelName!=null)
    {
      Name=LabelName.Text;
    }
    if(LabelDepartment!=null)
    {
      Department=LabelDepartment.Text;
    }
    
    }
    
    
    2011年2月24日 6:29
  • 看来问题出在模板里放什么,放服务控件就能获取,放普通的html就不能。这也解释的通,毕竟asp.net只对服务器控件才保存状态。

    但DataItem还是无法获取,因此也无法回答楼主提出的如何获取到列的问题。

    需要对行或列的控制更强的话还是建议采用Gridview等控件。

    2011年2月24日 9:16
    版主