首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带孩子中继器的.net中继器

带孩子中继器的.net中继器
EN

Stack Overflow用户
提问于 2015-06-12 19:52:11
回答 1查看 486关注 0票数 2

我有下面这台带孩子中继器的asp.net中继器

代码语言:javascript
复制
<asp:Repeater ID="MainAccordianRepeater" runat="server">
    <ItemTemplate>
    <div class="panel panel-default">
        <div class="panel-heading">
        <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#accordion" class="mainAccordLink" href="#collapse<%# Eval("catId").ToString() %>">
            <%# Eval("catDesc").ToString() %>
            </a>
            <input type="button" value="<%# Eval("btnTxt").ToString() %>" onclick="Confirm('<%# Eval("statusFunction").ToString() %>root','<%# Eval("catId").ToString() %>')" class="<%# Eval("statusFunction").ToString() %> btn" id="rootbutton<%# Eval("catId").ToString() %>" />
        </h4>
        </div>
        <div id="collapse<%# Eval("catId").ToString() %>" class="panel-collapse collapse">
        <ul id="childUl<%# Eval("catId").ToString() %>" class="childRepeater_DataBinding">
            <asp:Repeater ID="childRepeater" runat="server" OnDataBinding="ChildCats_DataBinding" />

            </asp:Repeater>
        </ul>
        </div>
    </div>
    </ItemTemplate>
</asp:Repeater>

这是应该填充中继器及其子级的代码

代码语言:javascript
复制
protected void GetRootCategories()
{
using (SqlConnection con = new SqlConnection(connStr))
{
    using (SqlCommand cmd = new SqlCommand("spR_GetRootCategories", con))
    {
    cmd.CommandType = CommandType.StoredProcedure;
    con.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    MainAccordianRepeater.DataSource = reader;
    MainAccordianRepeater.DataBind();
    con.Close();
    }
}
}
protected void ChildCats_DataBinding(object sender, System.EventArgs e)
{
Repeater rep = (Repeater)(sender);

int parentCatId = (int)(Eval("catId"));
using (SqlConnection con = new SqlConnection(connStr))
{
    using (SqlCommand cmd = new SqlCommand("spR_GetChildCategories", con))
    {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@ParentId", parentCatId);
    con.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    //rep.DataSource = rdr;
    //rep.DataBind();
    con.Close();
    }
}
}

问题是当我取消这两行的注释时

代码语言:javascript
复制
    //rep.DataSource = rdr;
    //rep.DataBind();

它会崩溃,并出现错误

代码语言:javascript
复制
System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool. 

有人能帮我吗?

我已经将代码修改为

代码语言:javascript
复制
protected void ChildCats_DataBinding(object sender, System.EventArgs e)
{
    Repeater rep = (Repeater)(sender);

    int parentCatId = (int)(Eval("catId"));
    DataSet ChildCatsDs = new DataSet();
    using (SqlConnection con = new SqlConnection(connStr))
    {
        using (SqlCommand cmd = new SqlCommand("spR_GetChildCategories", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@ParentId", parentCatId);
            con.Open();
            SqlDataAdapter cCats = new SqlDataAdapter();
            cCats.SelectCommand = cmd;
            cCats.Fill(ChildCatsDs);
            //SqlDataReader rdr = cmd.ExecuteReader();

            rep.DataSource = ChildCatsDs;
            rep.DataBind();
            con.Close();
        }
    }
}

但它只会给出完全相同的结果

我刚刚将它再次修改为这个

代码语言:javascript
复制
protected void ChildCats_DataBinding(object sender, System.EventArgs e)
{
    Repeater rep = (Repeater)(sender);

    int parentCatId = (int)(Eval("catId"));
    DataSet ChildCatsDs = new DataSet();
    using (SqlConnection con = new SqlConnection(connStr))
    {
        using (SqlCommand cmd = new SqlCommand("spR_GetChildCategories", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@ParentId", parentCatId);
            con.Open();
            SqlDataAdapter cCats = new SqlDataAdapter();
            cCats.SelectCommand = cmd;
            cCats.Fill(ChildCatsDs);
            //SqlDataReader rdr = cmd.ExecuteReader();

            //rep.DataSource = ChildCatsDs;
            //rep.DataBind();
            con.Close();
        }
    }
    DataTable dt = new DataTable();
    dt.Columns.Add("catId");
    dt.Columns.Add("parentId");
    dt.Columns.Add("catDesc");
    dt.Columns.Add("status");
    dt.Columns.Add("statusFunction");
    dt.Columns.Add("btnTxt");
    dt.Columns.Add("disabled");
    DataRow dr = dt.NewRow();
    dr["catId"] = 83;
    dr["parentId"] = 72;
    dr["catDesc"] = "orange";
    dr["status"] = "0";
    dr["statusFunction"] = "enable";
    dr["btnTxt"] = "activate";
    dr["disabled"] = "t";
    dt.Rows.Add(dr);
    rep.DataSource = dt;
    rep.DataBind();
}

页面就会超时

EN

回答 1

Stack Overflow用户

发布于 2015-06-12 20:22:25

您应该根据父中继器的ItemDataBoundEvent绑定子中继器。尝试如下所示

代码语言:javascript
复制
protected void MainAccordianRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    try
    {

        Repeater rep = e.Item.FindControl("childRepeater") as Repeater;

        int parentCatId = (int)(Eval("catId"));
        using (SqlConnection con = new SqlConnection(connStr))
        {
            using (SqlCommand cmd = new SqlCommand("spR_GetChildCategories", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@ParentId", parentCatId);
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                rep.DataSource = rdr;
                rep.DataBind();
                con.Close();
            }
        }
    }
    catch (Exception ex)
    {

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30802412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档