none
DataList的事件DataList1_ItemDataBound 具体怎么执行,感觉次数少了 RRS feed

  • 问题

  • 我在Page_Load里面绑定了datalist  ,

    if (!IsPostBack)
                {
                        DataList1.DataSource = tbl;
                        DataList1.DataBind();            }

    在ItemTemplate 上添加了一个隐藏字段,<asp:Label ID="lblNum" runat="server" Text=<%# Eval("contestant_id")%> Visible="false"></asp:Label>

    在DataList1_ItemDataBound里面 if (e.Item.ItemType == ListItemType.Item)
                {
                    //参赛编号
                    Label lblNum = (Label)e.Item.FindControl("lblNum");}

    我单步调式,参赛编号居然有空值,实际没有空值的,tbl里有54条记录,DataList1_ItemDataBound 里面居然只执行了27次就结束了,难道不是绑定一行执行一行吗?
    空值是怎么出现的?

    如果我要在这里DataList1_ItemDataBound 绑定dropdownlist可以吗?有简单点的例子吗? msdn的例子都不是在这里绑定的    多谢!!!

    2011年3月14日 3:56

答案

  • 你好!

    1 修改下判断如下:

    if (e.Item.ItemType == ListItemType.Item || 
           e.Item.ItemType == ListItemType.AlternatingItem)
    // ...
    
    2 参考下面的示例:
    <%@ Page Language="C#" AutoEventWireup="True" %>
    <%@ Import Namespace="System.Data" %>
     
    <html>
      <script runat="server">
     
       ICollection CreateDataSource() 
       {
       
         // Create sample data for the DataList control.
         DataTable dt = new DataTable();
         DataRow dr;
     
         // Define the columns of the table.
         dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
         dt.Columns.Add(new DataColumn("StringValue", typeof(String)));
         dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
     
         // Populate the table with sample values.
         for (int i = 0; i < 5; i++) 
         {
          dr = dt.NewRow();
     
          dr[0] = i;
          dr[1] = "Description for item " + i.ToString();
          dr[2] = 1.23 * (i + 1);
     
          dt.Rows.Add(dr);
         }
     
         DataView dv = new DataView(dt);
         return dv;
    
       }
     
     
       void Page_Load(Object sender, EventArgs e) 
       {
    
         // Load sample data only once, when the page is first loaded.
         if (!IsPostBack) 
         {
          ItemsList.DataSource = CreateDataSource();
          ItemsList.DataBind();
         }
    
       }
    
       void Item_Bound(Object sender, DataListItemEventArgs e)
       {
         if (e.Item.ItemType == ListItemType.Item || 
           e.Item.ItemType == ListItemType.AlternatingItem)
         {
    
          // Retrieve the Label control in the current DataListItem.
          Label PriceLabel = (Label)e.Item.FindControl("PriceLabel");
    
          // Retrieve the text of the CurrencyColumn from the DataListItem
          // and convert the value to a Double.
          Double Price = Convert.ToDouble(
            ((DataRowView)e.Item.DataItem).Row.ItemArray[2].ToString());
    
          // Format the value as currency and redisplay it in the DataList.
          PriceLabel.Text = Price.ToString("c");
    
           // 绑定 dropdownlist
          var ddl = e.Item.FindControl("ddl1") as DropDownList;
          ddl.DataSource = CreateDataSource();
          ddl.DataTextField = "IntegerValue";
          ddl.DataBind();
         }
    
       }
     
      </script>
     
    <body>
     
      <form id="Form1" runat=server>
    
       <h3>DataList ItemDataBound Example</h3>
     
       <asp:DataList id="ItemsList"
          BorderColor="black"
          CellPadding="5"
          CellSpacing="5"
          RepeatDirection="Vertical"
          RepeatLayout="Table"
          RepeatColumns="3"
          ShowBorder="True"
          OnItemDataBound="Item_Bound"
          runat="server">
    
         <HeaderStyle BackColor="#aaaadd">
         </HeaderStyle>
    
         <AlternatingItemStyle BackColor="Gainsboro">
         </AlternatingItemStyle>
    
         <HeaderTemplate>
    
          List of items
    
         </HeaderTemplate>
            
         <ItemTemplate>
    
          Description: <br>
          <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
    
          <br>
    
          Price: 
          <asp:Label id="PriceLabel"
             runat="server"/>
             <asp:DropDownList ID="ddl1" runat="server"></asp:DropDownList>
         </ItemTemplate>
     
       </asp:DataList>
     
      </form>
     
    </body>
    </html>
    

     


    知识改变命运,奋斗成就人生!
    2011年3月14日 4:49
    版主
  • OK! Thank you very much!
    • 已标记为答案 falconshh 2011年3月14日 8:03
    2011年3月14日 8:03

全部回复

  • 你好!

    1 修改下判断如下:

    if (e.Item.ItemType == ListItemType.Item || 
           e.Item.ItemType == ListItemType.AlternatingItem)
    // ...
    
    2 参考下面的示例:
    <%@ Page Language="C#" AutoEventWireup="True" %>
    <%@ Import Namespace="System.Data" %>
     
    <html>
      <script runat="server">
     
       ICollection CreateDataSource() 
       {
       
         // Create sample data for the DataList control.
         DataTable dt = new DataTable();
         DataRow dr;
     
         // Define the columns of the table.
         dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
         dt.Columns.Add(new DataColumn("StringValue", typeof(String)));
         dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
     
         // Populate the table with sample values.
         for (int i = 0; i < 5; i++) 
         {
          dr = dt.NewRow();
     
          dr[0] = i;
          dr[1] = "Description for item " + i.ToString();
          dr[2] = 1.23 * (i + 1);
     
          dt.Rows.Add(dr);
         }
     
         DataView dv = new DataView(dt);
         return dv;
    
       }
     
     
       void Page_Load(Object sender, EventArgs e) 
       {
    
         // Load sample data only once, when the page is first loaded.
         if (!IsPostBack) 
         {
          ItemsList.DataSource = CreateDataSource();
          ItemsList.DataBind();
         }
    
       }
    
       void Item_Bound(Object sender, DataListItemEventArgs e)
       {
         if (e.Item.ItemType == ListItemType.Item || 
           e.Item.ItemType == ListItemType.AlternatingItem)
         {
    
          // Retrieve the Label control in the current DataListItem.
          Label PriceLabel = (Label)e.Item.FindControl("PriceLabel");
    
          // Retrieve the text of the CurrencyColumn from the DataListItem
          // and convert the value to a Double.
          Double Price = Convert.ToDouble(
            ((DataRowView)e.Item.DataItem).Row.ItemArray[2].ToString());
    
          // Format the value as currency and redisplay it in the DataList.
          PriceLabel.Text = Price.ToString("c");
    
           // 绑定 dropdownlist
          var ddl = e.Item.FindControl("ddl1") as DropDownList;
          ddl.DataSource = CreateDataSource();
          ddl.DataTextField = "IntegerValue";
          ddl.DataBind();
         }
    
       }
     
      </script>
     
    <body>
     
      <form id="Form1" runat=server>
    
       <h3>DataList ItemDataBound Example</h3>
     
       <asp:DataList id="ItemsList"
          BorderColor="black"
          CellPadding="5"
          CellSpacing="5"
          RepeatDirection="Vertical"
          RepeatLayout="Table"
          RepeatColumns="3"
          ShowBorder="True"
          OnItemDataBound="Item_Bound"
          runat="server">
    
         <HeaderStyle BackColor="#aaaadd">
         </HeaderStyle>
    
         <AlternatingItemStyle BackColor="Gainsboro">
         </AlternatingItemStyle>
    
         <HeaderTemplate>
    
          List of items
    
         </HeaderTemplate>
            
         <ItemTemplate>
    
          Description: <br>
          <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
    
          <br>
    
          Price: 
          <asp:Label id="PriceLabel"
             runat="server"/>
             <asp:DropDownList ID="ddl1" runat="server"></asp:DropDownList>
         </ItemTemplate>
     
       </asp:DataList>
     
      </form>
     
    </body>
    </html>
    

     


    知识改变命运,奋斗成就人生!
    2011年3月14日 4:49
    版主
  • 多谢, 刚才我改好了 ,问题就是出现在ListItemType.AlternatingItem 这里,能简单解释下吗?
    2011年3月14日 4:52
  • 你好!

    你在 ItemDataBound 事件中增加下面的代码运行就会明白了

     Response.Write(e.Item.ItemType.ToString() + "<br />");
    


    知识改变命运,奋斗成就人生!
    2011年3月14日 4:56
    版主
  • 恩 十分感谢,再想追问一个问题:

    datalist上我放一个linkbutton,怎么在linkbutton的lbtnModify_Command事件里面得到该行的其他控件上的值呢?

    比如该行上的textbox(客户已经修改了该值) ,目前我只得到了linkbutton传过来的一个id参数,linkbutton的CommandEventArgs e  能得到该行的其他控件上的值吗?我没有用edittemplate ,行都是在itemtemplate中的。

    2011年3月14日 5:53
  • 你好!

    把你需要访问的值写到 Literal 等控件中,后面使用 e.Item.FindControl 的方式取得控件,再取控件的值。


    知识改变命运,奋斗成就人生!
    2011年3月14日 6:16
    版主
  • lbtnModify_Command(object sender, CommandEventArgs e)

    这个e 里面没有item属性。。。 取不到行里面的textbox 或者dropdownlist控件 。。汗

    2011年3月14日 6:44
  • 使用 OnItemCommand 事件
    知识改变命运,奋斗成就人生!
    2011年3月14日 7:14
    版主
  • OK! Thank you very much!
    • 已标记为答案 falconshh 2011年3月14日 8:03
    2011年3月14日 8:03