当前位置:编程学习 > C#/ASP.NET >>

关于repeater和ajax的问题?急

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
          <asp:DropDownList ID="ddl" runat="server" AppendDataBoundItems="True" DataTextField="type" DataValueField="id" 
                OnSelectedIndexChanged="changeFirst" AutoPostBack="true">
            </asp:DropDownList> 
            <asp:DropDownList ID="ddl2" runat="server" AppendDataBoundItems="True" DataTextField="type" DataValueField="id" 
                OnSelectedIndexChanged="changeSecond" AutoPostBack="true" Visible="false">
            </asp:DropDownList> 
            <asp:DropDownList ID="ddl3" runat="server" OnSelectedIndexChanged="changeThird"  AutoPostBack="true"  DataTextField="type" DataValueField="id" Visible="false">
            </asp:DropDownList>
             </ContentTemplate>
</asp:UpdatePanel>
上面是一个自定义控件的代码:DropDocType3
配合<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

在单个页面直接放入:
<uc1:DropDocType3 ID="DropDocType32" runat="server" />
实现的联动菜单局部刷新的。

但是在页面中把DropDocType3绑定在repeater里后:
    <asp:UpdatePanel ID="UpdatePanel11" runat="server">
        <ContentTemplate>
    <asp:Repeater ID="Repeater1" runat="server" 
        onitemdatabound="Repeater1_ItemDataBound" >
    <ItemTemplate>
        <uc1:DropDocType3 ID="DropDocType31" runat="server" />
    </ItemTemplate>
    </asp:Repeater>
    </ContentTemplate>
    </asp:UpdatePanel>
思路是想repeater里的联动菜单也局部刷新,但实际页面是整体刷新。
望各位指教该如何处理这个问题?已经纠结两三天了。。。 --------------------编程问答-------------------- 是不是在IsPostBack里面重新绑定了数据。 --------------------编程问答-------------------- 使用repeater绑定后,联动菜单是空白,不绑定数据,所以用户控件的Page_Load
加了
if (!IsPostBack || ddl.Items.Count == 0)
 {
      bindDDL();
}
--------------------编程问答--------------------

<form runat="server">
    <asp:Repeater ID="Repeater1" runat="server" 
        onitemdatabound="Repeater1_ItemDataBound">
    <ItemTemplate>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
        onselectedindexchanged="DropDownList1_SelectedIndexChanged1">
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True" 
        onselectedindexchanged="DropDownList2_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList3" runat="server">
    </asp:DropDownList>
    </ItemTemplate>
    </asp:Repeater>
</form>
    void BindRepeater()
    {
        DataTable dtSel = new DataTable();
        dtSel.Columns.Add("3name");
        dtSel.Columns.Add("3value");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtSel.NewRow();
            dr["3name"] = "3name" + i.ToString();
            dr["3value"] = "3value" + i.ToString();
            dtSel.Rows.Add(dr);
        }
        Repeater1.DataSource = dtSel;
        Repeater1.DataBind();
    }

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DropDownList rep = e.Item.FindControl("DropDownList1") as DropDownList;//找到里层的repeater对象
            DataTable dtSel = new DataTable();
            dtSel.Columns.Add("name");
            dtSel.Columns.Add("value");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dtSel.NewRow();
                dr["name"] = "name" + i.ToString();
                dr["value"] = "value" + i.ToString();
                dtSel.Rows.Add(dr);
            }
            rep.DataSource = dtSel;
            rep.DataValueField = "value";
            rep.DataTextField = "name";
            rep.DataBind();
        }
    }

    void DropDownList1_SelectedIndexChanged1(object sender, EventArgs e)
    {

        DataTable dtSel = new DataTable();
        dtSel.Columns.Add("2name");
        dtSel.Columns.Add("2value");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtSel.NewRow();
            dr["2name"] = "2name" + i.ToString();
            dr["2value"] = "2value" + i.ToString();
            dtSel.Rows.Add(dr);
        }
        //(sender as DropDownList).Parent 可获取 repeatitem
        //。。。
    }

至于写成你那种控件方式暂时不知道了 --------------------编程问答-------------------- “找到里层的repeater对象”这个是错的,找到里层的dropdownlist控件 --------------------编程问答-------------------- 你所说情况跟你现在情况刚好搞反了,你应该把这个(UpdatePanel)放在repeater外面这样才是局部刷新repeater,你那种方式只是局部刷新你的控件的,但是repeater不是局部刷新的。 --------------------编程问答--------------------
引用 5 楼 HJ850126 的回复:
你所说情况跟你现在情况刚好搞反了,你应该把这个(UpdatePanel)放在repeater外面这样才是局部刷新repeater,你那种方式只是局部刷新你的控件的,但是repeater不是局部刷新的。

控件内的UpdatePanel取消掉,只单单在repeater外面放UpdatePanel也是无效的。 --------------------编程问答--------------------
引用 4 楼 cheery_an 的回复:
“找到里层的repeater对象”这个是错的,找到里层的dropdownlist控件


加了Triggers指定控件的ID也无效 --------------------编程问答--------------------
引用 3 楼 cheery_an 的回复:

<form runat="server">
    <asp:Repeater ID="Repeater1" runat="server" 
        onitemdatabound="Repeater1_ItemDataBound">
    <ItemTemplate>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
        onselectedindexchanged="DropDownList1_SelectedIndexChanged1">
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True" 
        onselectedindexchanged="DropDownList2_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList3" runat="server">
    </asp:DropDownList>
    </ItemTemplate>
    </asp:Repeater>
</form>
    void BindRepeater()
    {
        DataTable dtSel = new DataTable();
        dtSel.Columns.Add("3name");
        dtSel.Columns.Add("3value");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtSel.NewRow();
            dr["3name"] = "3name" + i.ToString();
            dr["3value"] = "3value" + i.ToString();
            dtSel.Rows.Add(dr);
        }
        Repeater1.DataSource = dtSel;
        Repeater1.DataBind();
    }

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DropDownList rep = e.Item.FindControl("DropDownList1") as DropDownList;//找到里层的repeater对象
            DataTable dtSel = new DataTable();
            dtSel.Columns.Add("name");
            dtSel.Columns.Add("value");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dtSel.NewRow();
                dr["name"] = "name" + i.ToString();
                dr["value"] = "value" + i.ToString();
                dtSel.Rows.Add(dr);
            }
            rep.DataSource = dtSel;
            rep.DataValueField = "value";
            rep.DataTextField = "name";
            rep.DataBind();
        }
    }

    void DropDownList1_SelectedIndexChanged1(object sender, EventArgs e)
    {

        DataTable dtSel = new DataTable();
        dtSel.Columns.Add("2name");
        dtSel.Columns.Add("2value");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtSel.NewRow();
            dr["2name"] = "2name" + i.ToString();
            dr["2value"] = "2value" + i.ToString();
            dtSel.Rows.Add(dr);
        }
        //(sender as DropDownList).Parent 可获取 repeatitem
        //。。。
    }

至于写成你那种控件方式暂时不知道了



重点不是绑定数据控件,重点在随便用一个dropdownlist作为一个下来菜单,绑定到页面的repeater中后,下来有变动后页面会刷新,实际不想刷新,等于要repeater内局部刷新。 --------------------编程问答-------------------- 不懂,哇哈哈,我是来顶贴的
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,