为什么datalist的itemcreated事件里生成的datalist的id固定不了,总是要带上父datalist的id

解决方案 »

  1.   

    因为继承了 INamingContainer 借口
    INamingContainer是一个没有方法的标记接口,当控件在实现INamingContainer时,ASP.NET页框架可在该控件下创建新的命名范围,因此能够确保子控件在控件的分层树中具有唯一的名称。
      

  2.   

    请问如果我要用FindControl找到生成的DataList,该怎么办呢,
    生成的id类似dlOne__ctl0_dlTwo_0  dlOne__ctl1_dlTwo_1  dlOne__ctl1_dlTwo_2
      

  3.   

    /// 数据绑定事件
    private void dgList_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if ( e.Item.ItemIndex < 0 )
    {
    return;
    } e.Item.FindControl("ID");
    }其中 ID 是dlTwo,不需要写dlOne__ctl0_dlTwo_0
      

  4.   

    只能在dgList_ItemCreated事件里才能找到吗,出了这个事件还有办法找到吗
      

  5.   

    DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    DataList1_ItemCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
    DataList1_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    DataList1_EditCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
    DataList1_DeleteCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
    DataList1_CancelCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
    DataList1_UpdateCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
      

  6.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.IO;namespace HNAS.IMP.IMPVoteWebUI
    {
    /// <summary>
    /// test 的摘要说明。
    /// </summary>
    public class test1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataList dlOne;
    protected System.Web.UI.WebControls.Button Button1;
    protected System.Web.UI.HtmlControls.HtmlTable TableTitle; ICollection CreateDataSource() 
    {
    DataTable dt = new DataTable();
    DataRow dr;
    dt.Columns.Add(new DataColumn("ProjectValue", typeof(string)));
    for (int i = 0; i < 2; i++) 
    {
    dr = dt.NewRow();
    dr[0] = "分项 " + i.ToString();
    dt.Rows.Add(dr);
    }
    DataView dv = new DataView(dt);
    return dv;
    } ICollection CreateDataSource2(int i) 
    {
    DataTable dt = new DataTable();
    DataRow dr;
    if(i<0) i = 0;
    dt.Columns.Add(new DataColumn("QuestionValue",typeof(string)));
    for(int m=0;m<2;m++)
    {
    dr = dt.NewRow();
    dr[0] = "选项 " + m.ToString();
    dt.Rows.Add(dr);
    }
    DataView dv = new DataView(dt);
    return dv;
    } public void Page_Load(Object sender, EventArgs e) 
    {
    dlOne.DataSource = CreateDataSource();
    dlOne.DataBind(); this.dlOne.ItemCreated += new DataListItemEventHandler(dlOne_ItemCreated); this.DataBind();
    }
    public void dlOne_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    // if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
    // {
    DataList dl = new DataList(); dl.ID = "dlTwo_"+e.Item.ItemIndex.ToString();
    dl.ItemTemplate = new myTemp1();
    dl.DataSource = CreateDataSource2(e.Item.ItemIndex );
    dl.DataBind();
    e.Item.Controls.Add (dl);
    // }
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()

    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void Button1_Click(object sender, System.EventArgs e)
    {
    //在这里怎么能找到dlTwo? 这样找不到
    for(int i=0;i<dlOne.Items.Count;i++)
    {
    DataList dl = (DataList)dlOne.Items[i].FindControl("dlTwo_"+i.ToString);
    }
    }
    } public class myTemp1 : ITemplate
    {
    static int itemcount;

    public void InstantiateIn(System.Web.UI.Control container)
    {
    Literal lc = new Literal();
    lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
    itemcount += 1;
    container.Controls.Add(lc);
    }
    public void TemplateControl_DataBinding(object sender, System.EventArgs e)
    {
    Literal lc;
    lc = (Literal) sender;
    DataListItem container = (DataListItem )lc.NamingContainer;

    lc.Text += "<tr><td>";
    lc.Text += DataBinder.Eval(container.DataItem, "QuestionValue");
    lc.Text += "</TD></TR>";
    }
    }
    }
      

  7.   

    在一个按钮事件里能找到吗?
    页面代码如下:
    <%@ Register TagPrefix="HNAS" Namespace="HNAS.IMP.WebComponents" Assembly="HNAS.IMP.WebComponents" %>
    <%@ Page language="c#" Codebehind="test1.aspx.cs" AutoEventWireup="false" Inherits="HNAS.IMP.IMPVoteWebUI.test1" %>
    <HTML>
    <script language="C#" runat="server"> </script>
    <body>
    <form runat="server">
    <table id="TableTitle" runat="server" width="100%" border="1">
    <tr>
    <td height="10">
    调查主题
    </td>
    </tr>
    </table>
    <asp:datalist id="dlOne" runat="server" RepeatDirection="Horizontal" Width="100%" Font-Size="8pt"
    BorderWidth="1" GridLines="Both" RepeatColumns="1" RepeatLayout="Table" Font-Name="Verdana"
    CellPadding="3" BorderColor="black">
    <SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
    <HeaderStyle BackColor="#aaaadd"></HeaderStyle>
    <AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
    <ItemTemplate>
    <%# DataBinder.Eval(Container.DataItem, "ProjectValue") %>
    </ItemTemplate>
    </asp:datalist>
    <asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
    </form>
    </body>
    </HTML>
      

  8.   

    可以这样使用
    <asp:DataList id="DataList1" runat="server">
    <ItemTemplate>
    <asp:DataList id="Datalist2" runat="server"></asp:DataList>
    </ItemTemplate>
    </asp:DataList>public void dlOne_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    DataList dataList = (DataList)e.Item.FindControl("Datalist2");
    ....
    }
      

  9.   

    兄弟,在public void dlOne_ItemCreated(object sender,System.Web.UI.WebControls.DataListItemEventArgs e)这个事件里面我不需要找,直接用就可以了,现在需要的就是在一个按钮事件内找到这个datalist,然后取的相应item的值
      

  10.   

    1、你的 dlTwo 的 ID 是结合 ItemIndex 动态生成的,也就是只能结合 ItemIndex 获取
    public void dlOne_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    DataList dl = new DataList();
    dl.ID = "dlTwo_"+e.Item.ItemIndex.ToString();
    ...
    }
    public void dlOne_ItemCommand(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    string ID = "dlTwo_"+e.Item.ItemIndex.ToString();
    DataList dl = (DataList)e.Item.FindControl("ID");
    }2、由于你的 DataList 是动态生成的,设计到控件生命周期的问题与视图状态的问题(解释起来又罗嗦了)